【问题标题】:Python: Looping through directory and saving each file using filename as data frame namePython:遍历目录并使用文件名作为数据框名称保存每个文件
【发布时间】:2018-04-07 14:11:30
【问题描述】:

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 pandas loops assign


【解决方案1】:

老实说,您的第一种方法是正确的。不幸的是,python 没有为您提供动态创建“可变数量的变量”的选项,正如您已经尝试并实现的那样。 然而!您可以创建一个字典并根据需要将数据框分配给字符串键。方法如下。

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理解

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。它比普通的+ 更安全。


参考文献

【讨论】:

  • 太棒了,然后使用最终字典有没有办法将所有内容作为单独的对象取出?我知道这会降低效率和不必要的,但我很好奇它是否容易做到。
  • @Olivia 确实不推荐,但有可能。您使用:globals().update(ddict) 但这会导致代码异味,最好将其留在字典中。
  • @Olivia os.path.join 将自动处理添加分隔符(如果不存在)。如果您真的想连接到字符串(而不是加入文件子路径),请使用+。否则,要加入子路径,使用os.path.join 被认为是一种很好的做法,而且它也是可移植的。
猜你喜欢
  • 2011-12-29
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
相关资源
最近更新 更多