novich
novich

Reputation: 79

How can I read files with similar names on python, rename them and then work with them?

I've already posted here with the same question but I sadly I couldn't come up with a solution (even though some of you guys gave me awesome answers but most of them weren't what I was looking for), so I'll try again and this time giving more information about what I'm trying to do.

So, I'm using a program called GMAT to get some outputs (.txt files with numerical values). These outputs have different names, but because I'm using them to more than one thing I'm getting something like this:

GMATd_1.txt
GMATd_2.txt
GMATf_1.txt
GMATf_2.txt

Now, what I need to do is to use these outputs as inputs in my code. I need to work with them in other functions of my script, and since I will have a lot of these .txt files I want to rename them as I don't want to use them like './path/etc'.

So what I wanted was to write a loop that could get these files and rename them inside the script so I can use these files with the new name in other functions (outside the loop).

So instead of having to this individually:

GMATds1= './path/GMATd_1.txt'
GMATds2= './path/GMATd_2.txt'

I wanted to write a loop that would do that for me.

I've already tried using a dictionary:

import os
import fnmatch

dict = {}

for filename in os.listdir('.'):
    if fnmatch.fnmatch(filename, 'thing*.txt'):
        examples[filename[:6]] = filename

This does work but I can't use the dictionary key outside the loop.

Upvotes: 2

Views: 1592

Answers (3)

Dan
Dan

Reputation: 45752

Since python 3.4 you should be using the built-in pathlib package instead of os or glob.

from pathlib import Path
import shutil

for file_src in Path("path/to/files").glob("GMAT*.txt"):
    file_dest = str(file_src.resolve()).replace("ds", "d_")
    shutil.move(file_src, file_dest)

Upvotes: 1

trotta
trotta

Reputation: 1226

If I understand correctly, you try to fetch files with similar names (at least a re-occurring pattern) and rename them. This can be accomplished with the following code:

import glob
import os

all_files = glob.glob('path/to/directory/with/files/GMAT*.txt')
for file in files:
    new_path = create_new_path(file) # possibly split the file name, change directory and/or filename
    os.rename(file, new_path)

The glob library allows for searching files with * wildcards and makes it hence possible to search for files with a specific pattern. It lists all the files in a certain directory (or multiple directories if you include a * wildcard as a directory). When you iterate over the files, you could either directly work with the input of the files (as you apparently intend to do) or rename them as shown in this snippet. To rename them, you would need to generate a new path - so you would have to write the create_new_path function that takes the old path and creates a new one.

Upvotes: 1

shubham
shubham

Reputation: 513

you can use

import os
path='.....' # path where these files are located
path1='.....' ## path where you want these files to store
i=1
for file in os.listdir(path):
    if file.endswith(end='.txt'):
        os.rename(path + "/" + file, path1 + "/"+str(i) + ".txt")   
    i+=1

it will rename all the txt file in the source folder to 1,2,3,....n.txt

Upvotes: 0

Related Questions