web-dev-qa-db-fra.com

Erreur Python: FileNotFoundError: [Errno 2] Aucun fichier ou répertoire de ce type.

J'essaie d'ouvrir le fichier à partir d'un dossier et de le lire, mais ce n'est pas le localiser. J'utilise Python3 

Voici mon code: 

import os
import glob

prefix_path = "C:/Users/mpotd/Documents/GitHub/Python-Sample-                
codes/Mayur_Python_code/Question/wx_data/"
target_path = open('MissingPrcpData.txt', 'w')
file_array = [os.path.abspath(f) for f in os.listdir(prefix_path) if 
f.endswith('.txt')]
file_array.sort() # file is sorted list

for f_obj in range(len(file_array)):
     file = os.path.abspath(file_array[f_obj])
     join_file = os.path.join(prefix_path, file) #whole file path

for filename in file_array:
     log = open(filename, 'r')#<---- Error is here

Error: FileNotFoundError: [Errno 2] No such file or directory: 'USC00110072.txt'

2
Mayur Potdar

Vous ne donnez pas le chemin complet d'un fichier à la open(), mais son nom.

Vous devrez soit os.path.join() corriger le chemin du répertoire ou os.chdir() au répertoire dans lequel les fichiers se trouvent.

Je peux toutefois en déduire de votre code que vous oubliez de modifier la liste file_array. Pour résoudre ce problème, remplacez la première boucle par ceci:

file_array = [os.path.join(prefix_path, name) for name in file_array]

De plus, rappelez-vous que os.path.abspath() ne peut pas déduire le chemin complet d'un fichier simplement par son nom.


Permettez-moi de répéter.

Cette ligne dans votre code:

file_array = [os.path.abspath(f) for f in os.listdir(prefix_path) if f.endswith('.txt')]

est faux. Cela ne vous donnera pas une liste avec les chemins absolus corrects. Ce que tu aurais dû faire c'est:

import os
import glob

prefix_path = ("C:/Users/mpotd/Documents/GitHub/Python-Sample-"    
               "codes/Mayur_Python_code/Question/wx_data/")
target_path = open('MissingPrcpData.txt', 'w')
file_array = [f for f in os.listdir(prefix_path) if f.endswith('.txt')]
file_array.sort() # file is sorted list

file_array = [os.path.join(prefix_path, name) for name in file_array]

for filename in file_array:
     log = open(filename, 'r')
2
Błażej Michalik

Vous utilisez un chemin relatif où vous devriez utiliser un chemin absolu. C'est une bonne idée d'utiliser os.path pour travailler avec les chemins de fichiers. La solution facile pour votre code est la suivante:

prefix = os.path.abspath(prefix_path) 
file_list = [os.path.join(prefix, f) for f in os.listdir(prefix) if f.endswith('.txt')]

Notez qu'il existe d'autres problèmes avec votre code:

  1. En python, vous pouvez faire for thing in things. Vous avez utilisé for thing in range(len(things)), il est beaucoup moins lisible et inutile.

  2. Vous devez utiliser les gestionnaires de contexte lorsque vous ouvrez un fichier. Lire plus ici .

0
jjj