我正在制作一个脚本,根据.CSV文件重命名我拥有的所有PDF文件,并且需要匹配。
CSV文件的数字如下:
P20084579
P10092865
P10147356
P20154177
P10028030
P10058367
P10122918
P10122478
P20008810
P10029609
P20015658
PDF文件的名称如下:
All_C_2017.1.pdf
All_C_2017.2.pdf
All_C_2017.3.pdf
All_C_2017.4.pdf
All_C_2017.5.pdf
All_C_2017.6.pdf
All_C_2017.7.pdf
All_C_2017.8.pdf
All_C_2017.9.pdf
All_C_2017.10.pdf
All_C_2017.11.pdf
等等,CSV文件的第一个数字(P20084579)与All_C_2017.1.pdf一起使用,所以我想将所有这些数字重命名为P20084579.pdf
我理解如何阅读CSV文件和globs
f = open('Test Names.csv', 'rb')
reader = csv.reader(f)
for row in reader:
print row[0]
pdf = glob.glob('*.pdf')
for pdfname in pdf:
print pdfname
我希望我能用OS.rename()模块做一些事情,让它有一个循环
os.rename(pdfname,row[0])
但是当我使用GLOB列出目录时 像这样的列表,如果我尝试使用此方法,它将错误地重命名文件:
All_C_2017.1.pdf
All_C_2017.10.pdf
All_C_2017.11.pdf
All_C_2017.2.pdf
All_C_2017.3.pdf
All_C_2017.4.pdf
All_C_2017.5.pdf
All_C_2017.6.pdf
All_C_2017.7.pdf
All_C_2017.8.pdf
All_C_2017.9.pdf
有什么建议吗?
答案 0 :(得分:1)
只有zip
(交错)两个结果(来自glob.glob
和csv.reader
)并重命名循环中的文件:
with open('Test Names.csv', 'r') as f:
for pdfname,row in zip(glob.glob('*.pdf'),csv.reader(f)):
os.rename(pdfname,row[0]+".pdf")
注释:
(new_basename,)
直接从csv文件中提取第一行(也是唯一一行),但它似乎存在更多列,所以忘了它。安全(r)版本:
with open('Test Names.csv', 'r') as f:
pdfs = glob.glob('*.pdf')
reader = list(csv.reader(f))
if len(pdfs)!=len(reader):
raise Exception("Length mismatch")
for pdfname,row in zip(pdfs,reader):
os.rename(pdfname,row[0]+".pdf")