如何在python中复制和解压缩目录中的文件

时间:2017-08-19 18:07:42

标签: python file directory copy unzip

我试图解压缩& amp;将几个子目录中的文件复制到目标目录。这是我的代码。

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文件,NO DIRECTORIES)

我的代码运行良好,直到找到源目录的结构(请参阅下面的注释)

+--- [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目录中解压缩它们但是还找不到解决方案......任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:0)

你的问题在于这行代码:

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)