首页 > 解决方案 > 将指定目录中的文件导入到单独的 pandas 数据帧中(并相应地命名它们)

问题描述

在 Win-server 下的子目录中组织的文件夹中有很多 .csv 文件。它们在每个目录中具有不同的结构/大小/编号。需要将它们全部挑出到不同的数据帧中,对应命名并jsonize每个数据帧:

import glob
import pandas as pd

singlefile = [pd.read_csv(filename) for filename in glob.glob("C:\data\*.csv")]

#this will read them all into the same DataFrame
df = pd.concat(singlefile, axis=0)
...
#and finally dump it into predefined singlefile.json
df.to_json("C:\data\singlefile.json")

如何修改它以便将它们解析为不同的数据帧,然后转储到不同的 json 中?

  1. 挑选出目录中的所有文件名,直到 !eof();
  2. 遍历要导入 DF 的文件列表并为其分配唯一名称;- 不覆盖同一个df中的数据;
  3. 将每个导出为单独的 json;

标签: pythonwindowspandas

解决方案


根据您是需要将数据保留在内存中还是只需要 JSON 文件,我建议使用以下方法:

如果您只需要 JSON 文件:按顺序执行所有操作(在写入 JSON 后覆盖 DataFrame)

import glob
import pandas as pd

filenames = glob.glob("C:\data\*.csv")

for idx, fname in enumerate(filenames):
    df = pd.read_csv(fname)
    out_fname = os.path.splitext(os.path.basename(fname))[0]
    ...
    # and finally dump it into predefined singlefile.json
    df.to_json("C:\data\df_{}.json".format(out_fname))

如果您需要在内存中保留所有 DataFrame:使用字典

import glob
import pandas as pd


filenames = glob.glob("C:\data\*.csv")

df_dict = {}

for idx, fname in enumerate(filenames):
    df_dict[fname] = pd.read_csv(fname)
    out_fname = os.path.splitext(os.path.basename(fname))[0]
    ...
    #and finally dump it into predefined singlefile.json
    df_dict[fname].to_json("C:\data\df_{}.json".format(out_fname))

现在您可以通过文件名作为键来访问每个 DataFrame。现在,JSON 与派生它们的 CSV 具有相同的名称。例如,如果 csv 被称为“data_foo.csv”,那么 JSON 将被称为“data_foo.json”。


推荐阅读