Вопрос-Ответ

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

Python запрашивает FileNotFoundError для имени файла, возвращаемого os.listdir [дубликат]

Я пытался выполнить итерацию по файлам в каталоге, подобном этому:

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'

Так что же здесь не так?

Переведено автоматически
Ответ 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

os.listdir(directory) возвращает список имен файлов в directory. Итак, если directory не является вашим текущим рабочим каталогом, вам нужно объединить имена этих файлов с фактическим каталогом, чтобы получить правильный абсолютный путь:

for filename in os.listdir(path):
filepath = os.path.join(path, filename)
f = open(filepath,'r')
raw = f.read()
# ...
Ответ 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
python