繁体   English   中英

在Python中复制zipfile的内容

[英]Copy content of zipfile in Python

我正在寻找通过网络目录递归搜索以标识zip文件中的所有.xls文件。 对于在zip文件中找到的每个XLS文件,我想将其复制到C:的本地位置。 到目前为止,这是我的脚本:

import os
import zipfile
import fnmatch
import shutil

rootPath = "L:\Data\Cases"
destPath = "C:\Test"
allFileList = []
zipList = []

# Create a list containing all files contained within L:\Data\Cases
for dirname, dirnames, filenames in os.walk(rootPath):
    for filename in filenames:
        allFileList.append(os.path.join(dirname, filename))

# Return a list of filepaths containing zipfiles.
for file in allFileList:
    if file.endswith(".zip"):
        zipList.append(file)

for file in zipList:
    with zipfile.ZipFile(file) as zip_file:
        for member in zip_file.namelist():
            if member.endswith(".xls"):
                filename = os.path.basename(member)
                if not filename:
                    continue
                source = zip_file.open(member)
                target = os.path.join(destPath, filename)
                shutil.copy2(source, target)

错误代码如下。 我认为该错误是由于将压缩容器中的文件实际复制到目标路径而引起的。

Traceback (most recent call last):
  File "C:/Users/user/Desktop/parsecsv.py", line 30, in <module>
    shutil.copy2(source, target)
  File "C:\Program Files\Python278\lib\shutil.py", line 130, in copy2
    copyfile(src, dst)
  File "C:\Program Files\Python278\lib\shutil.py", line 68, in copyfile
    if _samefile(src, dst):
  File "C:\Program Files\Python278\lib\shutil.py", line 63, in _samefile
    return (os.path.normcase(os.path.abspath(src)) ==
  File "C:\Program Files\Python278\lib\ntpath.py", line 487, in abspath
    path = _getfullpathname(path)

有什么建议么?

ZipFile.open()不返回文件系统路径,而是返回类似文件的ZipExtFile对象。 您想要的是ZipFile.extract() (然后您根本不需要shutil.copy() ):

# NB : untested code, refer to the doc for more infos
for file in zipList:
    with zipfile.ZipFile(file) as zip_file:
        for member in zip_file.namelist():
            if member.endswith(".xls"):
                zip_file.extract(member, destPath)

同样,对于FWIW,您不需要先构建所有文件的列表,然后构建zipfile的列表,然后在此列表上进行迭代-您也可以一遍就完成整个工作:

for dirname, dirnames, filenames in os.walk(rootPath):
    for filename in filenames:
        if not filename.endswith(".zip"):
            continue 
        fullpath = os.path.join(dirname, filename))
        with zipfile.ZipFile(fullpath) as zip_file:
            for member in zip_file.namelist():
                if member.endswith(".xls"):
                    zip_file.extract(member, destPath)

如bruno所述,我认为您无法检查zipfile内容,但我认为可以采用一种更简洁的方式在提取后将其删除,因此您可以使用shutil.rmtree删除其他内容。

def main():
rootPath = "C:\\rootpath"
destPath = "C:\\Test"
allFileList = []
zipList = []
# Create a list containing all files contained within L:\Data\Cases
for dirname, dirnames, filenames in os.walk(rootPath):
    for filename in filenames:
        allFileList.append(os.path.join(dirname, filename))

# Return a list of filepaths containing zipfiles.
for file in allFileList:
    if file.endswith(".zip"):
        zipList.append(file)


for file in zipList:
    with zipfile.ZipFile(file) as zip_file:
        for member in zip_file.namelist():
            if member.endswith(".xls"):
                zip_file.extract(member, destPath)

for dirname, dirnames, filenames in os.walk(destPath):
    for filename in filenames:
        if not filename.endswith(".xls"):
            shutil.rmtree(filename)

if __name__ == '__main__':
main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM