首页 > 解决方案 > 读取多个 txt 并为每个使用原始文件中的名称创建 df

问题描述

文件夹有五个或六个 .csv 文件。我想使用 pd.read_csv() 一次读取所有这些,然后将每个 df 保存为 jupyter 中特定于文件名的变量,没有任何路径或文件类型。

例如,假设这是两个文件:

'../main/data/csv_files/file_1.csv'
'../main/data/csv_files/file_2.csv'

我可以对每个这样做:

file_1 = pd.read_csv('../main/data/csv_files/file_1.csv')
file_2 = pd.read_csv('../main/data/csv_files/file_2.csv')

但是,我的问题是如何在保持文件名命名约定的情况下使用循环或所有文件一次完成所有操作?

我可以使用 glob 或其他方式获取 csv 文件的所有文件路径的列表。然后我可以创建一个字典来将它们全部放入,但它使用它们的完整文件路径作为名称。

path = r'../main/data/csv_files'
files = glob.glob(path + '/*.csv')

dfs = {}
for x in files:
    dfs[x] = pd.read_csv(x)

这可行,但完整路径的命名并不理想。

标签: python-3.xpandascsv

解决方案


如果您的文件名不是来自网络等不受信任的来源,请使用exec运行 python 命令。

import ntpath

for x in files:
    # /a/b/c.csv => c.csv
    file_without_path = ntpath.basename(x) 

    # c.csv => c
    file_without_extension = file_without_path[:-4] 

    # execute "c = pd.readcsv('a/b/c.csv')"
    exec("{} = pd.read_csv('{}')".format(file_without_extension, x))

如果文件名不可信,请不要这样做,因为文件名中的任何代码都会被执行。


推荐阅读