[英]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.