Чтение всех файлов из каталога - PullRequest
0 голосов
/ 03 октября 2019

У меня проблема с чтением файлов из каталога. Путь к архиву получен из tkinter методом get(). Но мой код вызывает эту ошибку (файл существует в нем):

FileNotFoundError: [Ошибка 2] Нет такого файла или каталога: 'filename.csv'

Вот функция:

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])

Ответы [ 3 ]

0 голосов
/ 03 октября 2019

и добро пожаловать в stackoverflow! Чтобы мы могли помочь вам лучше всего, важно, чтобы вы предоставили минимальный воспроизводимый пример . Сложно помочь, не зная, например, что это за метод get.

При этом, пара вещей, которые могут помочь:

Вы можете использовать функцию glob из встроенногоМодуль glob для получения всех файлов, которые соответствуют определенному шаблону в дереве каталогов.

import glob

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

Это проще, чем перебирать дерево каталогов вручную.

Далее, вы можете использоватьсторонние библиотеки, такие как pandas, для более простой загрузки CSV-файлов, с более высоким уровнем API:

import pandas as pd

df = pd.read_csv(filename)

В целом, вы получите что-то вроде:

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]

Или если вы хотите манипулироватькаждый загруженный файл первым, чтобы сохранить первый столбец, например, или приведение к типу с плавающей точкой:

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 голосов
/ 03 октября 2019

Вам нужен полный путь к файлу, с корнем и каталогом.

Вот простое исправление вашего кода:

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])

Обратите внимание, что вы предполагаете, что у вас есть толькоcsv файлов в этом каталоге (и подкаталогах)

Итак, добавьте метод .endswith(), чтобы подтвердить только открытие CSV-файлов

0 голосов
/ 03 октября 2019

Ваша ошибка в норме:

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

Вы разбили вывод os.walk между r (который содержит базовый репозиторий), d (которыйсодержит вложенные репозитории) и f (который содержит имена файлов)

Когда вы делаете:

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

Вы пытаетесь открыть имена файлов в текущем рабочем каталоге, а негде они хранятся.

Вы хотите прочитать все файлы для каталога и включить все подкаталоги или просто хотите, чтобы все файлы в базовом каталоге?

Для второго вариантаСамый простой способ достичь этой цели - это:

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])
...