Python:如何创建一个 zipfile 并将其写入多个目录/文件夹?
Posted
技术标签:
【中文标题】Python:如何创建一个 zipfile 并将其写入多个目录/文件夹?【英文标题】:Python: How to create a zipfile and write it to multiple directories/folders? 【发布时间】:2021-09-15 03:07:36 【问题描述】:我有一个 .txt 文件,我想将它压缩成一个 zip 文件并写入多个目录。
这个函数创建一个目录列表,我想读取压缩的 .txt 文件:
dir_path = 'N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021'
directories_list = retrieve_file_paths(dir_path)
directories_list
这是输出:
N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021\Alabama\AL_ICF_2021
N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021\Alabama\AL_IP_2021
N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021\Alabama\AL_OP_2021
N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021\Alabama\AL_PHYS_2021
N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021\Alabama\AL_NF_2021
N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021\Alabama\AL_CLNC_2021
N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021\Alabama\AL_IMD_2021
N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/2021\Alabama\AL_PRTF_2021
注意:我希望将压缩文件放入最后一个文件夹(例如 AL_ICF_2021)
这是带有 .txt 文件路径的代码,我尝试将其压缩并将其写入目录列表。
# Assign the name of the directory to zip
zipfile_name = 'N:/Project/50813_Medicaid_UPL_DSH/NJ1/Data Files from CMS/UPL/Guidance_Document_Extract/_ticket5250_sandbox/guidancedocnotes.txt'
# Compress .txt into a zipfile
zip_file = zipfile.ZipFile('guidancedocnotes.zip', 'w')
zip_file.write(zipfile_name, compress_type=zipfile.ZIP_DEFLATED)
for folder in folder_list:
complete_name = os.path.join(zip_file, folder_list)
print(complete_name)
这是我收到的错误消息:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-37-57432b3f2938> in <module>
24 # Call the main function
25 if __name__ == "__main__":
---> 26 main()
<ipython-input-37-57432b3f2938> in main()
18
19 for folder in folder_list:
---> 20 complete_name = os.path.join(zip_file, folder_list)
21 print(complete_name)
22
~\AppData\Local\Continuum\Anaconda3\lib\ntpath.py in join(path, *paths)
74 # Join two (or more) paths.
75 def join(path, *paths):
---> 76 path = os.fspath(path)
77 if isinstance(path, bytes):
78 sep = b'\\'
TypeError: expected str, bytes or os.PathLike object, not ZipFile
我基本上想在上面列出的每个目录中放置一个名为 guidedocsnote.zip 的单独 zip 文件。我该怎么做才能让它发挥作用?谢谢
【问题讨论】:
【参考方案1】:我不确定您的实际问题是什么。看起来你已经完成了 90% 的工作。 我不熟悉“os.path.join”,但假设它正在生成一个完全限定的路径,那么您只需将 zip 文件复制并粘贴到该位置,而不是打印路径名。
可能需要在这里提供更多信息。
【讨论】:
如果有帮助,我附上了错误消息 这一行:"complete_name = os.path.join(zip_file, folder_list)" 应该是:"complete_name = os.path.join(zip_file, folder)" 你需要记住那个'文件夹'是单个路径,而 'folder_list' 是整个列表。当您处于 for 循环中时,您应该使用“文件夹”。 Mitchell 提供的答案可能是一个很好的起点。问题是您正在打印而不是将文件保存在文件夹位置。我猜你这样做是为了调试并检查文件夹路径是否正确。【参考方案2】:os.path.join
接受 src 和 target 目录并返回一个路径。目前,您正在传递 zipfile 对象而不是字符串。 os.path.join
不会保存任何内容,而是会返回您可以保存内容的路径。
你的问题并不完全清楚,但我认为这是你想要的
# Compress .txt into a zipfile
zip_file = zipfile.ZipFile('guidancedocnotes.zip', 'w')
for folder in folder_list:
save_path = os.path.join(folder, zipfile_name)
zip_file.write(save_path, compress_type=zipfile.ZIP_DEFLATED)
【讨论】:
我试过了,但我没有看到 zipfile 被写入并保存到正确的文件夹中。以上是关于Python:如何创建一个 zipfile 并将其写入多个目录/文件夹?的主要内容,如果未能解决你的问题,请参考以下文章
Python - 将内存中的 ZipFile 对象加载为字节
Python:从 Google Drive API 获取 zip 文件并加载其内容