在 Python 中重命名 ZipFile

Posted

技术标签:

【中文标题】在 Python 中重命名 ZipFile【英文标题】:Renaming ZipFile in Python 【发布时间】:2015-06-20 17:44:05 【问题描述】:

要重命名我正在下载的 ZipFile 中的一个文件,我执行以下操作:

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?

就像this SO question的OP一样,我在引用重命名的文件时遇到了同样的错误。

更新:这没有正确更新第一个文件。虽然它似乎正确地重命名了文件,但它输出了最初命名的文件。

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)

【问题讨论】:

您要在浏览每个项目时进行提取吗?或者在 for 循环之外,在另一个 for 循环中会好吗?如果是后者,请不要在要重命名文件的同一个 for 循环中提取。而是使用 zipfile.close() 关闭 zipfile 并重新打开它,然后提取文件 【参考方案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()

【讨论】:

我还没有保存文件,因为我是直接从 url 下载的... zipfile = ZipFile(StringIO(url.read())) 你建议先保存它,然后然后重命名它? 只需将 StringIO 对象保存在一个变量中,它包含您的完整 zip 文件(在内存中),您可以再次将其包装在 ZipFile 中.. 见上文。当我尝试重命名它时没有找到它。我得到一个 KeyError 经过大量测试/研究后,我认为不可能重命名 zip 本身内的文件。您所能做的就是在解压后更改目录/文件名,正如您在***.com/questions/4917284/… 问题中给出的那样。

以上是关于在 Python 中重命名 ZipFile的主要内容,如果未能解决你的问题,请参考以下文章

tkinter 是不是在 Python 3.9.0b3 中重命名?

如何在 Python 中重命名解压缩的文件?

在 spark python 中重命名数据框列

在 C# / Python 中重命名远程文件服务器上的文件

在Python中重命名目录中的多个文件[重复]

在 Python 中重命名文件:WindowsError: [错误 2] 系统找不到指定的文件