将当前工作目录中的所有 CSV 文件读入具有正确文件名的 pandas

Posted

技术标签:

【中文标题】将当前工作目录中的所有 CSV 文件读入具有正确文件名的 pandas【英文标题】:Reading all CSV files in current working directory into pandas with correct filenames 【发布时间】:2016-12-17 15:41:51 【问题描述】:

我正在尝试使用循环来读取多个 CSV(现在但将来会混合使用它和 xls)。

我希望 pandas 中的每个数据框都具有相同的名称,不包括我文件夹中的文件扩展名。

import os 
import pandas as pd


files = filter(os.path.isfile, os.listdir( os.curdir ) )
files #   this shows a list of the files that I want to use/have in my directory- they are all CSVs if that matters

# i want to load these into pandas data frames with the corresponding filenames

 # not sure if this is the right approach....
 # but what is wrong is the variable is named 'weather_today.csv'... i need to drop the .csv or .xlsx or whatever it might be

for each_file in files:
    frame = pd.read_csv( each_file)
    each_file = frame

Bernie 看起来很棒但是有一个问题:

or each_file in files:
    frame = pd.read_csv(each_file)
    filename_only = os.path.splitext(each_file)[0]
   # Right below I am assigning my looped data frame the literal variable name of "filename_only" rather than the value that filename_only represents
   #rather than what happens if I print(filename_only)
    filename_only = frame

例如,如果我的两个文件在我的文件列表中分别是 weather_today、地震.csv(按此顺序),则不会创建“地震”和“天气”。

但是,如果我简单地键入“filename_only”并在 python 中单击回车键 - 那么我将看到地震数据框。如果我有 100 个文件,则列表循环中的最后一个数据框名称将标题为“filename_only”,而其他 99 个则不会,因为以前的分配从未进行过,第 100 个会覆盖它们。

【问题讨论】:

【参考方案1】:

您可以为此使用os.path.splitext() 来“将路径名路径拆分为一对 (root, ext),使得 root + ext == 路径,并且 ext 为空或以句点开头并且最多包含一个句点。 "

for each_file in files:
    frame = pd.read_csv(each_file)
    filename_only = os.path.splitext(each_file)[0]
    filename_only = frame

正如评论中所问的,我们想要一种过滤 CSV 文件的方法,以便您可以执行以下操作:

files = [file for file in os.listdir( os.curdir ) if file.endswith(".csv")]

【讨论】:

哇非常简单。如果您不介意询问我的第一部分 - files = filter(os.path.isfile, os.listdir( os.curdir ) ) ----- 有没有办法将其指定为特定扩展名。我对这种事情不熟悉...... 你所做的不就是用DataFrame覆盖filename_only中存储的文件名吗?它将在循环的下一次运行中被覆盖。有点不明白这一点。 我又试了一次,它似乎不起作用。我认为这是自从我通过 csv 读入它们以来第一次起作用。我重新启动了会话,但我仍然将所有文件作为“today_weather.csv”名称而不是 today_weather【参考方案2】:

使用字典来存储你的帧:

frames = 

for each_file in files:
    frames[os.path.splitext(each_file)[0]] = pd.read_csv(each_file)

现在您可以通过以下方式获取您选择的 DataFrame:

frames[filename_without_ext]

很简单,对吧?不过要注意 RAM 的使用,读取一堆文件会很快填满系统内存并导致崩溃。

【讨论】:

是的,但是为什么这行得通,而上面的方法却行不通?当我尝试使用上面的中间打印步骤时,我得到了一个名称,但上面答案的最后一部分似乎不适用于分配......我也想让它们将目录加载到内存中而不是列表中。 是字典,不是列表。两者有很大的不同。您确定您从@bernie 的答案中正确复制了代码吗?而你所要求的不能严格做到。除非您的程序编写代码然后执行它,否则您不能声明变量。正在执行的代码不能在 Python 中修改。你唯一能做的就是修改你的变量。字典允许命名键,您可以将值附加到这些键。这就是我的回答所做的,也是您回答问题的最简单方法。 好的,我理解那部分,但我相信出了问题的是单词 FILENAME_ONLY 被用作变量 aka "FILENAME_ONLY" = weather_data.csv 的拼写,而不是 FILENAME_ONLY '携带'提取拼写weather_data,从而设置weather_data = weather_data.csv 你在绕着我转!让代码说话。您可以使用@bernie 的答案和输出以及预期输出来编辑您的问题吗?那会很有帮助。

以上是关于将当前工作目录中的所有 CSV 文件读入具有正确文件名的 pandas的主要内容,如果未能解决你的问题,请参考以下文章

将多个 CSV 文件读入单独的数据帧

如何将具有多个标题行的csv文件读入熊猫? [关闭]

将包含一些空值的CSV文件读入VBA数组

使用 CsvHelper 将 CSV 中的所有值读入列表

将文件夹中的多个csv文件读入R中的单个数据框[重复]

读取文件夹中的所有 .csv 文件并绘制其内容