繁体   English   中英

将多个 csv 文件读入 Python 中的单独数据帧

[英]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 操作系统。 有人可以帮忙吗? 谢谢!

在您的示例中, pathfiles中每个文件的根目录,因此您可以

temp_df = pd.read_csv(os.path.join(path, files[i]))

但我们真的不会这样做。 假设目录中没有任何文件,那么next(os.walk("/Users/my_name/Desktop/All hypnograms/Healthy"))将引发您未处理的StopIteration错误。 我认为使用os.listdirglob.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM