Python引发FileNotFoundError错误,文件名由os.listdir返回

14

我尝试像这样迭代目录中的文件:

import os

path = r'E:/somedir'

for filename in os.listdir(path):
    f = open(filename, 'r')
    ... # process the file

但是Python抛出了FileNotFoundError,即使文件存在:

Traceback (most recent call last):
  File "E:/ADMTM/TestT.py", line 6, in <module>
    f = open(filename, 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'foo.txt'

那么这里有什么问题吗?

3个回答

13
因为 os.listdir 仅返回文件名部分,而不是完整路径,例如当打开 'E:/somedir/foo.txt' 时,'foo.txt' 并不存在于当前目录下。使用 os.path.join 将目录名添加至文件名前即可解决问题。
path = r'E:/somedir'

for filename in os.listdir(path):
    with open(os.path.join(path, filename)) as f:
        ... # process the file

另外,你没有关闭文件;with 块会自动处理它。


2
这里有一种替代方案,使用pathlib.Path.iterdir,它会产生完整的路径而不需要连接路径:
from pathlib import Path

path = Path(r'E:/somedir')

for filename in path.iterdir():
    with filename.open() as f:
        ... # process the file

2

os.listdir(directory) 返回 directory 中文件的名称列表。因此,除非directory 是当前工作目录,否则您需要将这些文件名与实际目录连接起来,以获取正确的绝对路径:

for filename in os.listdir(path):
    filepath = os.path.join(path, filename)
    f = open(filepath,'r')
    raw = f.read()
    # ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接