Python 为 os.listdir [duplicate] 返回的文件名引发 FileNotFoundError

Python raising FileNotFoundError for file name returned by os.listdir [duplicate]

提问人:Aarushi Mishra 提问时间:3/2/2015 最后编辑:SuperStormerAarushi Mishra 更新时间:9/10/2022 访问量:53268

问:

我试图遍历如下目录中的文件:

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'

那么这里出了什么问题呢?

Python 错误处理 文件未找到

评论


答:

13赞 Antti Haapala -- Слава Україні 3/2/2015 #1

这是因为 os.listdir 不返回文件的完整路径,只返回文件名部分;也就是说,当打开时需要,因为该文件在当前目录中不存在。'foo.txt''E:/somedir/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赞 Lukas Graf 3/2/2015 #2

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

for filename in os.listdir(path):
    filepath = os.path.join(path, filename)
    f = open(filepath,'r')
    raw = f.read()
    # ...
2赞 SuperStormer 9/10/2022 #3

这是使用 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