2015-06-20 3 views
0

Чтобы переименовать один файл в ZipFile, что я скачиванием, я следующее:Переименование ZipFile в Python

for item in zipfile.infolist(): 
    old_name = item.filename 
    match = re.search(r'(.*)(.mdb)', item.filename) 
    item.filename = "%s_friend%s" % (match.group(1),, match.group(2)) # I should probably be using replace here 
    zipfile.extract(old_name, save_dir) 

Однако, когда я хочу, чтобы извлечь этот файл и сохранить его в определенный каталог, я необходимо ссылаться на «old_name» и не может ссылаться на новое. Есть ли «чистый» способ как для извлечения переименованного файла? Или это более pythonic, чтобы сначала извлечь, а затем переименовать файл?

Как и OP this SO question, я сталкиваюсь с той же ошибкой при ссылке на переименованный файл.

обновлено: Это неправильное обновление первого файла. Хотя кажется, что он правильно переименовал файл, он выводит изначально именованный файл.

for item in zipfile.infolist(): 
    old_name = item.filename 
    match = re.search(r'(.*)(.mdb)', item.filename) 
    print match.group(1), match.group(2) 
    item.filename = "%s_%s%s" % (match.group(1), year, match.group(2)) 
    print item.filename 
zipfile.close() 
with ZipFile(curr_zip, 'r') as zpf: 
    for item in zpf.infolist(): 
     zpf.extract(item.filename, save_dir) 
+0

Вы хотите извлечь, как вы собираетесь через каждый пункт? Или это было бы хорошо вне цикла for, в другом для цикла? Если последний, не извлекайте в том же цикле, вы переименовываете файл. Вместо этого закройте zipfile с помощью zipfile.close() и снова откройте его, а затем извлеките файлы –

ответ

1

После тестирования выяснилось, что невозможно прямое переименование файла внутри папки zip. Все, что вы можете сделать, это создать новый zip-файл и добавить файлы обратно в новый zip-файл с использованием другого имени.

Пример кода для этого -

source = ZipFile('source.zip', 'r') 
target = ZipFile('target.zip', 'w', ZIP_DEFLATED) 
for file in source.filelist: 
    if not <filename_to_change>: 
     target.writestr(file.filename, source.read(file.filename)) 
    else: 
     target.writestr('newfilename', source.read(file.filename)) 
target.close() 
source.close() 
+0

. Я еще не сохранил файл, потому что я загружая его непосредственно из url ... zipfile = ZipFile (StringIO (url.read())) Вы рекомендуете сначала сохранить его, а затем переименовать? – NumenorForLife

+0

да, попробуйте пожалуйста. –

+0

Просто сохраните объект 'StringIO' в переменной, он содержит ваш полный zipfile (в памяти), и вы можете просто снова его обернуть в' ZipFile'. – dhke

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