2016-07-28 85 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'。 –