Python:遍历目录并使用文件名作为数据框名称保存每个文件

Python: Looping through directory and saving each file using filename as data frame name

R 中有一个名为 assign 的函数,它为环境中的名称赋值。

EG:

assign("Hello", 2)
> Hello
[1] 2

在 python 中,我似乎无法做到这一点。我最初尝试过:

import numpy as np
import pandas as pd
import os

for file in os.listdir('C:\Users\Olivia\Documents'):
    if file.endswith(".csv"):
        os.path.splitext(file)[0] = pd.read_csv('C:\Users\Olivia\Documents\' + file)

但我可以看到这是在尝试使一个字符串等于一个不起作用的文件。

我设法通过以下方式获取列表中的所有文件:

import glob

dl = glob.glob(r'C:\Users\Olivia\Documents\*.csv')
nl = []
for i in dl:
    pl = i.split(os.sep)
    name = pl[5][:-4]
    nl.append(name)

ddict = {}

 for k, v in zip(nl,dl):
    ddict[k] = ddict.get(k,"") + v

 dfl = []

 for k, v in ddict.items():
    dfl.append(read_csv(v))

但是现在如何从列表中取出每个数据框并命名为不带扩展名的文件。必须有一种方法可以将列表中的每个数据框分配为文件列表中的名称

老实说,您的第一种方法是正确的。不幸的是,python 没有提供动态创建 "variable number of variables" 的选项,正如您已经尝试并意识到的那样。 不过!您 可以 创建字典并根据需要将数据帧分配给字符串键。方法如下。

root = 'C:\Users\Olivia\Documents'

ddict = {}
for file in os.listdir(root):
    if file.endswith(".csv"):
        name = os.path.splitext(file)[0]
        ddict[name] = pd.read_csv(os.path.join(root, file))

构建这本词典的另一种方法是使用 dict comprehension:

ddict = {os.path.splitext(file)[0] : pd.read_csv(os.path.join(root, file)) 
                for file in os.listdir(root) if file.endswith('csv')
}

现在,引用单个数据框就像

一样简单
ddict['your_file_name']

另外需要注意的是,最安全 的文件合并方式是使用 os.path.join。它只是比普通的 +.

更安全

参考资料

  • How do I create a variable number of variables?
  • why use os.path.join over string concatenation