2013-10-28 2 views
0

У меня есть несколько файлов в директории,Переименование файлов в samekind через Python

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

То, что я хочу, это файлы одного и того же рода, даже если они имеют другое расширение, чтобы иметь такое же количество. Я сейчас потеряюсь, может кто-то, пожалуйста, помогите мне?

+0

Почему используется 'shutil.copy' вместо' os.rename'? – kren470

+0

Потому что я не должен перезаписывать файлы. Я должен хранить файл с каждого этапа. – user1345260

+1

Возможно, '' glob() '' не гарантирует возврат списка, отсортированного по имени файла. – fjarri

ответ

1

Выход glob.glob() неупорядочен. Сортировка имен файлов, если вы хотите, чтобы они были пронумерованы в лексикографическом порядке:

for num in sorted(found): 
+0

Это сработало. Большое спасибо – user1345260

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 

Это легко модифицировать этот код для того, что вам нужно.

+1

Легко изменить, но как насчет легко понять? – Christian

+0

@Christian Я действительно не вижу проблемы. Не могли бы вы указать, что трудно понять, поэтому я могу это объяснить? – kren470

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)) 
Смежные вопросы