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