[英]Reading multiple csv files into separate dataframes in Python
我已经阅读了多个答案,但到目前为止,没有一个在我的案例中起作用。 我想读取多个 csv 文件(可能与我的 python 文件不在同一目录中),而不指定名称(因为我可能必须读取数千个此类文件)。 我想做一些类似上一个例子的事情,但我不确定如何添加我的桌面路径。
我尝试了以下内容,如链接中所示:
# Assign path. The folder "Healthy" contains all the csv files
path, dirs, files = next(os.walk("/Users/my_name/Desktop/All hypnograms/Healthy"))
file_count = len(files)
# create empty list
dataframes_list = []
# append datasets to the list
for i in range(file_count):
temp_df = pd.read_csv("./csv/"+files[i])
dataframes_list.append(temp_df)
但是,我收到以下错误:“FileNotFoundError:[Errno 2] 没有这样的文件或目录:”。 我正在使用 MAC 操作系统。 有人可以帮忙吗? 谢谢!
在您的示例中, path
是files
中每个文件的根目录,因此您可以
temp_df = pd.read_csv(os.path.join(path, files[i]))
但我们真的不会这样做。 假设目录中没有任何文件,那么next(os.walk("/Users/my_name/Desktop/All hypnograms/Healthy"))
将引发您未处理的StopIteration
错误。 我认为使用os.listdir
、 glob.glob
甚至pathlib.Path
会更自然。 由于pathlib
为您跟踪根,一个不错的选择是
from pathlib import Path
import pandas as pd
healthy = Path("/Users/my_name/Desktop/All hypnograms/Healthy")
dataframes_list = [pd.read_csv(file) for file in healthy.iterdir()
if file.is_file()]
许多 pandas 错误继承自ValueError
。 如果某些文件有问题,可以将读取放入异常处理程序中,找出哪些文件出错
dataframes_list = []
error_files = []
for file in helthy.iterdir():
if file.is_file():
try:
dataframes_list.append(pd.read_csv(file, skiprows=18))
except ValueError as e:
error_files.append(file)
print(f"{file}: {e}")
我想您应该通过将路径变量添加到串联字符串来在read_csv
方法中指定整个路径。 就像是:
for i in range(file_count):
temp_df = pd.read_csv(path + "/csv/" + files[i])
dataframes_list.append(temp_df)
如果您的 CSV 文件位于 Healthy 目录中,您可以通过直接执行path + files[i]
来删除"/csv/"
您可以使用pathlib
轻松做到这一点:
import pandas as pd
import pathlib
DATA_DIR = pathlib.Path.home() / 'Desktop' / 'All hypnograms' / 'Healthy' / 'csv'
dataframes_list = []
for csvfile in DATA_DIR.glob('**/*.csv'):
temp_df = pd.read_csv(csvfile)
dataframes_list.append(temp_df)
假设您确实想通过排除非.csv
文件来过滤文件列表,以便使用 pandas 方法read_csv
:
建议执行的代码:
就像你不提供 dataframe 一样,我自愿排除pd.read_csv
但你必须在实际代码中使用pd.read_csv(os.path.join(path, f))
。
import os
from pathlib import Path
# Let'us suppose path and files following values
path = '/home/Motors'
files = ['engine.html', 'engine.csv']
dataframes_list=[]
for f in files:
if Path(f).suffixes[0]=='.csv':
# temp_df = pd.read_csv(os.path.join(path, f))
temp_df = os.path.join(path, f)
dataframes_list.append(temp_df)
print(dataframes_list)
结果:
['/home/Motors/engine.csv']
回答 S C 评论:
您应该做的是,作为第一步,创建一个包含所有名称的迭代器。 然后按块读取它以制作要处理的短列表名。
filenames = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M']
def iterchunks(filenames, n):
for i in range(0, len(filenames), n):
yield filenames[i:i + n]
chk = iterchunks(filenames, n=2)
print(next(chk))
# ['A', 'B']
print(next(chk))
# ['C', 'D']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.