Python dă FileNotFoundError pentru numele de fișier returnat de os.listdir (Programare, Python, Gestionarea Erorilor, Fișier Nedescoperit)

Aarushi Mishra a intrebat.

Încercam să iteratez peste fișierele dintr-un director ca acesta:

import os

path = r'E:/somedir'

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

Dar Python a aruncat FileNotFoundError chiar dacă fișierul există:

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'

Deci, ce este în neregulă aici?

Comentarii

  • Nu văd nici 1febrenamed nici 75_girls_ill_after_having_breakfast_-_Indian_Express.txt în os.listdir() ieșire. –  > Por L3viathan.
  • Am salvat TestT.py în E:/ADMTM. Acum știu că ar fi trebuit să fie în E:/ADMTM/Articles/1stfebrenamed(unde este stocat fișierul .txt) – dacă aș fi vrut să citesc fișierele fără calea completă a directorului. –  > Por Aarushi Mishra.
2 răspunsuri
Antti Haapala

Aceasta se datorează faptului că os.listdir nu returnează calea completă a fișierului, ci doar partea cu numele fișierului; adică 'foo.txt', atunci când deschideți ar dori 'E:/somedir/foo.txt' deoarece fișierul nu există în directorul curent.

Utilizați os.path.join pentru a preda directorul la numele fișierului:

path = r'E:/somedir'

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

(De asemenea, nu închideți fișierul; funcția with blocul se va ocupa de aceasta în mod automat).

Comentarii

  • Vă recomandăm să folosiți noul pathlib.Path.iterdir în locul funcției os.listdir. Este mai greu să faci greșeli prostești ca aceasta cu pathlib. Căile de acces la fișiere orientate pe obiecte ftw. –  > Por Aran-Fey.
  • @Aran-Fey atunci te rog să scrii un nou răspuns –  > Por Antti Haapala.
Lukas Graf

os.listdir(directory) returnează o listă de fișiere nume de fișiere în directory. Deci, dacă nu directory este directorul de lucru curent, trebuie să uniți aceste nume de fișiere cu directorul real pentru a obține o cale absolută adecvată:

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