从目录中读取所有文件
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文件
我在从目录读取文件时遇到问题。 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文件