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 - zipfiles的问题[关闭]

使用 ZipFile 模块从 zipfile 中删除文件

Python - 将内存中的 ZipFile 对象加载为字节

Python:从 Google Drive API 获取 zip 文件并加载其内容

如何创建一个变量并将其存储为 50 个观察值(python)?

Python zipfile 库 - 从一个目录创建一个仅包含 .pdf 和 .xml 文件的 zip