【问题标题】:how to copy and unzip files in directory in python如何在python目录中复制和解压缩文件
【发布时间】:2018-01-28 05:08:27
【问题描述】:

我正在尝试将几个子目录中的文件解压缩并复制到目标目录。这是我的代码。

import zipfile,fnmatch,os

rootPath = r"C:\\Temp\\Test\\source"
pattern = '*.zip'
for root, dirs, files in os.walk(rootPath):
    for filename in fnmatch.filter(files, pattern):
        zip_ref = zipfile.ZipFile(os.path.join(root, filename))
        zip_ref.extractall(os.path.join("C:\\Temp\\Test\\dest"))

如您所见,我已解压缩源目录中的所有文件并将它们复制到 dest(ination) 目录。预期的最终结果应该是解压并复制 dest 目录中的 TXT 文件。(只有 txt 文件,没有目录)

我的代码运行良好,直到我找到源目录的结构(请参考下面的评论)

+--- [source]
    |
    +--- [subdir1]
    |     |
    |     +--- file1.zip    # this zip file only contains a single txt file!
    |          
    | 
    +--- [subdir2]
    |
    |     +--- file2.zip    # this zip file contains a directory which contains a txt file!
| 

源目录中的大多数子目录看起来像 [subdir1],因此它们与我的代码完全兼容。但是也有一些例外,例如 [subdir2],其中 zip 文件不仅包含一个 txt 文件,而且还包含一个包含它的目录...... 这是当前代码下 dest 目录的样子。

+--- [dest]
    |
    +--- [subdir2]
    |     |
    |     +--- file2.txt
    |  
    +--- file1.txt
    | 

有什么想法可以让 dest 目录中只有解压缩和复制的 TXT 文件吗? 我考虑先复制 zip 文件,然后将它们解压缩到 dest 目录中,但还没有找到解决方案....任何帮助将不胜感激!

【问题讨论】:

    标签: python file directory copy unzip


    【解决方案1】:

    你的问题在于这行代码:

    zip_ref.extractall(os.path.join("C:\\Temp\\Test\\dest"))
    

    您不需要使用 os.path.join,因为它会附加源子文件夹名称。你可以用这个:

    zip_ref.extractall("C:\\Temp\\Test\\dest")
    

    编辑:

    os.path.join 是多余的,但是排除它并不能解决您的问题。

    问题是您不能在压缩文件上调用 os.walk。一个解决方案(虽然我认为有一个更有效的方法)是在所有文件被提取后将它们移动到根目录中。

    import os
    import shutil
    import fnmatch
    
    def gen_find(filepat,top):
        for path, dirlist, filelist in os.walk(top):
            for name in fnmatch.filter(filelist,filepat):
                yield os.path.join(path,name)
    
    
    
    if __name__ == '__main__':
        src = 'C:\\Temp\\Test\\dest'
    
        filesToMove = gen_find("*.txt",src)
        for name in filesToMove:
            shutil.move(name, src)
    

    【讨论】:

    • 我尝试了你的建议,但结果看起来还是一样:(
    • 加入 1 个路径部分会产生相同的路径部分。不是很清楚,但两条线都一样。
    • 我认为这是因为子文件夹本身(包含一个 txt 文件)被解压了...
    • @0liveradam8 idk 为什么它仍然没有显示预期的结果,但非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多