2016-07-28 84 views
0

假設我有一個包含1000個csv文件的文件夾,其名稱爲event_1.csv,event_2.csv,...,event_1000.csvPython:重命名文件返回錯誤的名稱

我其實有25個文件夾,這樣,想以這樣的方式將這些文件重命名前4個字符是0001的第一個文件夾,0002第二,高達0025一路。最後4個字符表示事件,例如第一個事件是0001,第二個0002,一直到1000

因此,第一個文件夾中的第一個文件以這種方式更改:event_1.csv = 00010001.csv

反正我的代碼是錯誤的,因爲在一號文件夾中的第一個100個文件被命名爲00020000.csv00020099.csv,因爲0002應該只在第二文件夾中。然後,從第101個文件到最後,我得到正確的文件名:00010101.csv00011000.csv

這是我的代碼:那有什麼問題?

import os, sys 
import glob 
import csv 

directory=r'C:\Users\MyName\Desktop\Tests' 
subdir=[x[0] for x in os.walk(directory)] 
subdir.pop(0) 

N=['0001','0002','0003','0004','0005','0006','0007','0008','0009','0010','0011','0012','0013','0014','0015','0016','0017','0018','0019','0020','0021','0022','0023','0024','0025'] 

for i in subdir: 
    for n in N: 
     temp_dir=r''+i 
     os.chdir(temp_dir) 
     A=str(n) 
     for file in glob.glob("*.csv"): 
      if len(file)==11: 
       event='000'+str(file[6]) 
       newname=A+event 
       os.rename(file, newname + '.csv') 
      if len(file)==12: 
       event='00'+str(file[6:8]) 
       newname=A+event 
       os.rename(file, newname + '.csv') 
      if len(file)==13: 
       event='0'+str(file[6:9]) 
       newname=A+event 
       os.rename(file, newname + '.csv') 
      if len(file)==14: 
       event=file[6:10] 
       newname=A+event 
       os.rename(file, newname + '.csv') 
+1

您可能想要查看[zero-padding](http://stackoverflow.com/questions/339007/nicest-way-to-pad-zeroes-to-string)來簡化您的代碼 –

回答

1

如果你確定你的所有文件的名稱,你可以大大簡化你的代碼(如M.T說的)。嘗試也許是這樣的:

for n,i in enumerate(subdir): 
     os.chdir(r''+i) # Or whatever your folders are named 
     for m,file in enumerate(glob.glob("*.csv")): 
      newname = "{0:04d}{1:04d}.csv".format(n+1,m+1) 
      os.rename(file, newname) 

編輯:它與枚舉更好。

+0

'subdir'是所有25個文件夾的列表,位於母文件夾中。 – FaCoffee

+1

這將忽略文件的當前名稱,只需按glob.glob()返回的順序重命名即可。 – polku

+1

也許使用'enumerate'來代替計數器,但是''''''格式''寫入'n + 1'的代價是?並且'n ++'不是Python語法,而是'n + = 1'。 –