提取特定文件在 python 中不起作用
Extract a particular file doesn't works in python
我需要 1) 在特定目录位置找到一个 zip 文件 2) 如果它存在则将其解压缩 3) 从其内容中找到一个特定文件并将其移动到其他目录。
def searchfile():
for file in os.listdir('/user/adam/datafiles'):
if fnmatch.fnmatch(file, 'abc.zip'):
return True
return False
if searchfile():
print('File exists')
else:
print('File not found')
def file_extract():
os.chdir('/user/adam/datafiles')
file_name = 'abc.zip'
destn = '/user/adam/extracted_files'
zip_archive = ZipFile (file_name)
zip_archive.extract('class.xlsx',destn)
print("Extracted the file")
zip_archive.close()
file_extract()
当我执行上面的脚本时,它没有显示编译时问题或运行时问题。但它只适用于第一个功能。当我检查 extracte_files 文件夹中的文件时,我没有看到这些文件。
自动化无聊的东西中有一个很好的章节可以帮助解决这个问题
所以为了完整起见并且我的评论解决了你的问题,我想我应该把它作为一个答案:
在Python中,如果定义了函数foo
(def foo(<...>):
),
foo
指的是函数本身,可以被复制(有效地复制指针),传递给其他函数,...关于任何对象;
foo()
是一个没有向该函数传递参数的调用。
由于这题好像不是作业,所以补充一下:
要改进您的代码,您可能需要查看:
- 函数的参数(你的函数目前只做一件事。例如,你可以将文件和目录名传递给
searchfile
);
os.path
及其所有内容;
- 用于检查对象是否在容器中的
in
测试;
with
语句更清晰、更安全地处理对象,例如 ZipFile
实例;
-
x if b else y
信任;
请注意,即使存档不存在,您的代码仍会尝试从中提取文件。
这里有一个更强大的方法来实现你想要的:
import os
import zipfile
arch_name, file_name = 'abc.zip', 'class.xlsx'
home_dir = os.path.join(os.path.abspath(os.sep), 'user', 'adam')
# or even better: home_dir = os.path.expanduser('~')
arch_dir = os.path.join(home_dir, 'datafiles')
dest_dir = os.path.join(home_dir, 'extracted_files')
arch_path = os.path.join(arch_dir, arch_name)
if os.path.isfile(arch_path):
print('File {} exists'.format(arch_path))
with zipfile.ZipFile(arch_path) as archive:
archive.extract(file_name, dest_dir)
print('Extracted {} from {}'.format(file_name, arch_name))
else:
print('File {} not found'.format(arch_path))
免责声明:此代码未经测试,可能包含小错误!
请注意代码的后半部分如何使用可以轻松修改的通用变量在前半部分的一个地方。另外,请注意 if os.path.isfile(arch_path):
相对于 if searchfile():
的可读性有所提高(要求我们阅读 searchfile
的实现)。
我需要 1) 在特定目录位置找到一个 zip 文件 2) 如果它存在则将其解压缩 3) 从其内容中找到一个特定文件并将其移动到其他目录。
def searchfile():
for file in os.listdir('/user/adam/datafiles'):
if fnmatch.fnmatch(file, 'abc.zip'):
return True
return False
if searchfile():
print('File exists')
else:
print('File not found')
def file_extract():
os.chdir('/user/adam/datafiles')
file_name = 'abc.zip'
destn = '/user/adam/extracted_files'
zip_archive = ZipFile (file_name)
zip_archive.extract('class.xlsx',destn)
print("Extracted the file")
zip_archive.close()
file_extract()
当我执行上面的脚本时,它没有显示编译时问题或运行时问题。但它只适用于第一个功能。当我检查 extracte_files 文件夹中的文件时,我没有看到这些文件。
自动化无聊的东西中有一个很好的章节可以帮助解决这个问题
所以为了完整起见并且我的评论解决了你的问题,我想我应该把它作为一个答案:
在Python中,如果定义了函数foo
(def foo(<...>):
),
foo
指的是函数本身,可以被复制(有效地复制指针),传递给其他函数,...关于任何对象;foo()
是一个没有向该函数传递参数的调用。
由于这题好像不是作业,所以补充一下:
要改进您的代码,您可能需要查看:
- 函数的参数(你的函数目前只做一件事。例如,你可以将文件和目录名传递给
searchfile
); os.path
及其所有内容;- 用于检查对象是否在容器中的
in
测试; with
语句更清晰、更安全地处理对象,例如ZipFile
实例;-
x if b else y
信任; 请注意,即使存档不存在,您的代码仍会尝试从中提取文件。
这里有一个更强大的方法来实现你想要的:
import os
import zipfile
arch_name, file_name = 'abc.zip', 'class.xlsx'
home_dir = os.path.join(os.path.abspath(os.sep), 'user', 'adam')
# or even better: home_dir = os.path.expanduser('~')
arch_dir = os.path.join(home_dir, 'datafiles')
dest_dir = os.path.join(home_dir, 'extracted_files')
arch_path = os.path.join(arch_dir, arch_name)
if os.path.isfile(arch_path):
print('File {} exists'.format(arch_path))
with zipfile.ZipFile(arch_path) as archive:
archive.extract(file_name, dest_dir)
print('Extracted {} from {}'.format(file_name, arch_name))
else:
print('File {} not found'.format(arch_path))
免责声明:此代码未经测试,可能包含小错误!
请注意代码的后半部分如何使用可以轻松修改的通用变量在前半部分的一个地方。另外,请注意 if os.path.isfile(arch_path):
相对于 if searchfile():
的可读性有所提高(要求我们阅读 searchfile
的实现)。