2017-01-26 2 views
3

Я ищу сценарий, который переименовывает все файлы PDF, основанные на файле .CSV, и они должны соответствовать.переименование файлов с помощью CSV и glob

файл 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 и глобусы

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]) 

Но когда я использую Глоб перечислить каталоги это списки так что он будет неправильно переименовывать файл, если я попытаюсь использовать этот метод:

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

просто 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, но, похоже, больше столбцов, поэтому забудьте об этом.
  • Если длина файла .csv недостаточна, переименование остановится. Лучше убедиться, что размеры равны. Операция может быть трудно отменить.

Safe (г) Версия:

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") 
+0

Я получаю «Слишком много значений для распаковки» ошибки, но это действительно хороший способ сделать это, я все еще новичок в Python и техника его подводит знать о zip-функции –

+0

исправлено, проверьте мои изменения. –

+0

Я был близок к тому, чтобы понять это! огромное спасибо! –

Смежные вопросы