从目录中读取所有文件

Reading all files from directory

我在从目录读取文件时遇到问题。 diegtory 的路径是使用 get() 方法从 tkinter 获得的。但是我的代码引发了这个错误(文件存在于其中):

FileNotFoundError: [Error 2] No such file or directory: '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])

您的错误在 :

中是正常的
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])

欢迎使用 Whosebug!为了让我们为您提供最好的帮助,请务必提供 minimal reproducible example。例如,在不知道这个 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)

您需要完整的文件路径,包括根目录和目录。

这是对您的代码的简单修复:

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文件