如何使用 zipfile python 压缩文件夹
Posted
技术标签:
【中文标题】如何使用 zipfile python 压缩文件夹【英文标题】:How to compress folders using zipfile python 【发布时间】:2020-01-27 14:57:35 【问题描述】:所以到目前为止,我的程序能够成功添加和压缩与test.py
位于同一目录中的文件,但在同一目录中还有一个名为location
的文件夹,其中包含其他文件,比如citynames.txt
什么发生是当我做一个简单的 zip.write (else
块中使用的逻辑)location
被添加到 zip 文件中,但是它是空的,因为某种原因它里面不包含citynames.txt
请帮我添加文件夹本身不知何故?
import os
import zipfile
import shutil
dir_path = os.path.dirname(os.path.realpath(__file__)) #holds the directory where script is located
os.chdir(dir_path) #Changes to directory where script is located
fp=os.listdir(dir_path) #file pointer
directory_size=len(os.listdir(dir_path))
zip1=zipfile.ZipFile('Archive.zip','w')
for i in range(directory_size) :
if fp[i]=='test.py':
break
if fp[i]=='location':
#Some code needs to be added here to write all the contents of folder "location" into
"Archive.zip"
else:
zip1.write(fp[i],compress_type=zipfile.ZIP_DEFLATED)
print("Process completed")
编辑
假设 location 有更多的子文件夹如何压缩其中的文件?
【问题讨论】:
你有代码,做一个备份,这样你就可以恢复,然后尝试运行它。 是的,我做到了.. 谢谢!而且它仍然没有给我locations
子文件夹或其内容整天都在尝试:S
【参考方案1】:
上市[Python 3.Docs]: zipfile - Work with ZIP archives。
您的代码中的(主要)问题是您将 continue 误认为是 break。这样,当遇到 test.py 时,它后面的所有项目都会被忽略,因为 break 会退出循环。
这是一个使用[Python 3.Docs]: glob.iglob(pathname, *, recursive=False) 递归到子目录并在存档中添加文件的变体。
code00.py:
#!/usr/bin/env python
import sys
import os
import glob
import zipfile
def main(*argv):
archive_name = "archive.zip"
dir_path = os.path.dirname(os.path.realpath(__file__))
dir_path_len = len(dir_path) + len(os.path.sep)
with zipfile.ZipFile(archive_name, mode="w", compression=zipfile.ZIP_DEFLATED) as zf:
for file_name in glob.iglob(os.path.join(dir_path, "**"), recursive=True):
if os.path.isdir(file_name):
continue
member_name = file_name[dir_path_len:]
if member_name in [
os.path.basename(__file__),
archive_name,
]:
continue
print(member_name)
zf.write(file_name, member_name)
if __name__ == "__main__":
print("Python 0:s 1:dbit on 2:s\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
main(*sys.argv[1:])
print("\nDone.")
输出:
e:\Work\Dev\***\q059933596>tree /f /a Folder PATH listing for volume SSD0-WORK Volume serial number is AE9E-72AC E:. | code00.py | file0.txt | \---locations | location0.tzt | location1.txt | \---subdir0 subdir0file0.txt e:\Work\Dev\***\q059933596>"e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" code00.py Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] 64bit on win32 file0.txt locations\location0.tzt locations\location1.txt locations\subdir0\subdir0file0.txt Done. e:\Work\Dev\***\q059933596>dir *.zip Volume in drive E is SSD0-WORK Volume Serial Number is AE9E-72AC Directory of e:\Work\Dev\***\q059933596 20/01/27 20:13 547 archive.zip 1 File(s) 547 bytes 0 Dir(s) 113,094,475,776 bytes free
【讨论】:
非常感谢您,这非常有效...我想您只是为我节省了 2-3 天 :D 非常感谢您的帮助 :)【参考方案2】:您需要将 location 中的每个文件单独添加到 zip1
。
将此添加到相应的if
-branch:
for f in os.listdir("location"):
zip1.write("location/"+f, compress_type=zipfile.ZIP_DEFLATED)
【讨论】:
如果位置中还有文件夹,您能否将其更新为?让它是动态的? 另外我不想压缩文件夹的内容,而是压缩文件夹本身......所以当说压缩像库这样的东西时,它不会破坏文件组织结构...... 1) 我今天可能无法解决这个问题,抱歉。自己尝试并更新您的问题或在遇到问题时提出新问题。 2)它不应该破坏结构。至少对我来说不是。 更新问题【参考方案3】:您无法将目录添加到 zip 存档的原因是因为 zip1.write
不是递归的(它不会添加目录树下方的文件,只会添加您明确告诉它添加的文件) .您需要使用 os.walk
浏览所有子目录并单独添加每个文件:
import os
import zipfile
def zipdir(dir_to_archive, archive_filename):
ziph = zipfile.ZipFile(archive_filename, 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk(dir_to_archive):
for file in files:
if file != archive_filename:
ziph.write(os.path.join(root, file))
ziph.close()
os.chdir(dir_path)
zipdir(dir_path, 'Archive.zip')
注意,以上代码改编自thisMark Byers的回答。
【讨论】:
以上是关于如何使用 zipfile python 压缩文件夹的主要内容,如果未能解决你的问题,请参考以下文章