使用CSV和glob

时间:2017-01-26 14:24:23

标签: python

我正在制作一个脚本,根据.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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

只有zip(交错)两个结果(来自glob.globcsv.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文件中提取第一行(也是唯一一行),但它似乎存在更多列,所以忘了它。
  • 如果.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")