0

ディレクトリにいくつかのファイルがありますが、

file_IL.txt
file_IL.csv
file_NY.txt
file_NY.csv

シーケンス番号を取得できるように名前を変更する必要があります。例えば、

file_IL.txt_001
file_IL.csv_001
file_NY.txt_002
file_NY.csv_002

私は次のPythonコードを書きました

def __init__(self):  

    self.indir = "C:\Files" 

def __call__(self):  

    found = glob.glob(self.indir + '/file*')  
    length = len(found)  
    counts = {}

    for num in found:
        ext = num.rsplit(".",1)[-1]    # Right split to get the extension
        count = counts.get(ext,0) + 1  # get the count, or the default of 0 and add 1
        shutil.copy(num, num+'_'+'%03d' % count)   # Fill to 3 zeros
        counts[ext] = count            # Store the new count

これは時々機能しますが、次のように結果がスローされることがあります。

file_IL.txt_001
file_IL.csv_002
file_NY.txt_002
file_NY.csv_001

私が欲しいのは、同じ数を持つために拡張子が異なっていても、同じ種類のファイルです。私は今ちょっと道に迷っています、誰か助けてくれませんか?

4

3 に答える 3

1

の出力glob.glob()は順不同です。辞書順に番号を付けたい場合は、ファイル名を並べ替えます。

for num in sorted(found):
于 2013-10-28T02:18:01.087 に答える
0

多分これはあなたを助けるでしょう:

a=["file_IL.txt", "file_IL.csv","file_NY.txt","file_NY.csv"]
#split by dot
b = sorted([i.split('.') for i in a])

i=0
c=1

#loop through b
while i<len(b)-1:
    #start at the current index (i)
    for j in range(i, len(b)):
        #Check if file name of the current element (b[j][0]) is equal to 
        #the file name that you started with (b[i][0]).
        #If so, rename the file, else break
        if b[i][0]==b[j][0]:
            print "%s.%s%03d"%(b[j][0], b[j][1], c)
        else:
            break
    #increment your counter
    c+=1
    #increase i to the index of the file name that is not equal to the one that
    #you started with
    i=j

必要に応じてこのコードを簡単に変更できます。

于 2013-10-28T02:21:05.370 に答える
0

私はこのようなことをしたでしょう。

filenames =['file_IL.txt', 'file_IL.csv',
            'file_NY.txt', 'file_NY.csv']
extensions = {b:[] for b in set([x.split('.')[0] for x in filenames])}
newnames = []

for fname in filenames:
    extensions[fname.split('.')[0]].append(fname)

for i,fnames in enumerate(extensions.values()):
    for fname in fnames:
        newnames.append('{0}_{1:03d}'.format(fname, i))
于 2013-10-28T02:26:02.037 に答える