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): withopen(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