3 回答
TA贡献1155条经验 获得超0个赞
问题是您试图从与您列出的目录不同的目录中打开相对文件路径。与其使用os它,不如使用一个更高级别的接口,例如pathlib:
import pathlib
for file_name in pathlib.Path("/Users/ramikhoury/PycharmProjects/R/excel_files").glob("*.xslx"):
# this produces full paths for you to use
pathlib是在Python 3.4中添加的,因此,如果您使用的是旧版本的python,则最好的选择是使用更老的glob模块,该模块的功能类似:
import glob
for file_name in glob.glob("/Users/ramikhoury/PycharmProjects/R/excel_files/*.xslx"):
# this also produces full paths for you to use
如果出于某种原因您确实需要使用低级os接口,则解决此问题的最佳方法是使用对以下dir_fd参数的可选参数open:
# open the target directory
dir_fd = os.open("/Users/ramikhoury/PycharmProjects/R/excel_files", os.O_RDONLY)
try:
# pass the open file descriptor to the os.listdir method
for file_name in os.listdir(dir_fd):
# you could replace this with fnmatch.fnmatch
if file_name.endswith(".xlsx"):
# use the open directory fd as the `dir_fd` argument
# this opens file_name relative to your target directory
with os.fdopen(os.open(file_name, os.O_RDONLY, dir_fd=dir_fd)) as file_:
# do excel bits here
finally:
# close the directory
os.close(dir_fd)
尽管可以通过更改脚本顶部的目录来完成此修复(如另一个答案所建议),但这具有更改进程的当前工作目录的副作用,这通常是不希望的,并且可能会带来负面影响。为了使这项工作没有副作用,需要您chdir返回到原始目录:
# store cwd
original_cwd = os.getcwd()
try:
os.chdir("/Users/ramikhoury/PycharmProjects/R/excel_files")
# do your listdir, etc
finally:
os.chdir(original_cwd)
请注意,这会在您的代码中引入竞争条件,original_cwd可能会被删除,或者可能更改了该目录的访问控制,从而使您无法chdir返回到目录,这正是dir_fd存在的原因。
dir_fd是在Python 3.3中添加的,因此,如果您使用的是旧版本的Python,我建议您仅使用glob而不是chdir解决方案。
添加回答
举报