Tengo un problema al leer archivos de un directorio. La ruta al diegtory se obtiene de tkinter con el método get(). Pero mi código genera este error (el archivo es existente):

FileNotFoundError: [Error 2] No existe tal archivo o directorio: 'filename.csv'

Aquí está la función:

def readf(self):
    for r, d, f in os.walk(self.name_m.get()):
        for filepath in f:
            with open(filepath, 'r') as csvFile:
                reader = csv.reader(csvFile)
                m = np.array([])
                for row in reader:
                    m = np.append(m, float(row[0])
0
D53E 3 oct. 2019 a las 08:58

3 respuestas

La mejor respuesta

Su error es normal en:

for r, d, f in os.walk(self.name_m.get()):

Divide la salida de os.walk entre r (que contiene el repositorio base), d (que contiene los repositorios secundarios) y f (que contiene nombres de archivo)

Cuando lo haga:

for filepath in f:
          with open(filepath, 'r') as csvFile:

Intenta abrir los nombres de archivo en su directorio de trabajo actual y no donde están almacenados.

¿Desea leer todos los archivos de un directorio e incluir todo el subdirectorio o simplemente quiere todos los archivos en el directorio base?

Para la segunda opción, la forma más sencilla de lograr este objetivo es hacer:

import glob
import os

def readf(self):
   for filepath in [fic for fic in glob.glob(os.path.join(self.name_m.get(), '*.csv'))]:
       with open(filepath, 'r') as csvFile:
           reader = csv.reader(csvFile)
           m = np.array([])
              for row in reader:
                 m = np.append(m, float(row[0])
0
Yannick Guéhenneux 3 oct. 2019 a las 06:15

Necesita la ruta completa del archivo, con la raíz y el directorio.

Aquí hay una solución simple a su código:

for root, directories, files in os.walk(self.name_m.get()):
    for r in root:
        for d in directories:
            for f in files:
                with open(os.path.join(r,d,f), 'r') as cur_file:
                    if cur_file.read().endswith((".csv")): 
                        reader = cur_file.reader(csvFile)
                        m = np.array([])
                        for row in reader:
                            m = np.append(m, float(row[0])

Observe que está asumiendo aquí que solo tiene archivos csv en ese directorio (y subdirectorios)

Entonces, agregue el método .endswith() para confirmar que solo se abren archivos csv

0
M.F 3 oct. 2019 a las 06:42

Y bienvenido a stackoverflow! Para que podamos ayudarlo mejor, es importante que proporcione un ejemplo reproducible mínimo. Es difícil ayudar sin saber qué es este método get, por ejemplo.

Dicho esto, un par de cosas que podrían ayudar:

Puede usar la función glob del módulo integrado glob para obtener todos los archivos que coinciden con un cierto patrón en un árbol de directorios.

import glob

files = glob.glob('/path/to/files/**/*.csv', recursive=True)

Esto es más fácil que iterar sobre el árbol de directorios manualmente.

Además, puede usar bibliotecas de terceros como pandas para cargar archivos csv más fácilmente, con una API de nivel superior:

import pandas as pd

df = pd.read_csv(filename)

En general, obtendrías algo como:

import glob
import pandas as pd

files = glob.glob('/path/to/files/**/*.csv', recursive=True)

file_list = [pd.read_csv(filenamee) for filenamee in files]

O si desea manipular primero cada archivo cargado, para mantener la primera columna, por ejemplo, o emitir para flotar:

file_list = []
for filename in files:
    res = pd.read_csv(filename)
    res = res.iloc[:, 0] # keep the first column
    res = res.apply(float) # cast to float
    file_list.append(res)
0
Charles 3 oct. 2019 a las 06:23
58213087