Python:导入csv文件,将dict name设置为filename,将headers设置为键,将列设置为值

时间:2015-12-30 03:10:30

标签: python csv dictionary pandas

我有一个包含文件夹的目录,每个文件夹里面大约有20个CSV文件,每个文件都有不同的文件名;文件包含A,B,C,D,E列,每列包含数字数据(某些条目为NaN)。我想要的是每个文件名都是字典的名称,其中A,B,C,D,E是该字典中的键,下面的数据是这些键的值。

作为一个例子:

A  B  C  D  E
0  3  6  1  6
1  6  1  0  5
3  4  9  8  5
7  6  4  0  9
如果重要的话,

这些列中的数字不是必需的。

我想我想出了如何使用for循环将dict名称设置为filename,即:

rootDir = 'path'
for dirName, subdirList, fileList in os.walk(rootDir, topdown=False):
     for fname in FileList
        fname = {} #I think this makes each dictionary have the same name as the file

我找到了一种使用http://pythoncentral.io/how-to-traverse-a-directory-tree-in-python-guide-to-os-walk/

读取csvs值的方法

filepath = os.path.join(rootDir, dirName, fname)
var = pd.read_csv(filepath, na_values=str) #reads in NaN values

理想情况下,这将一次读取一个CSV。

但我不确定这对我有什么帮助。我看了一下pandas Dataframe.to_dict(),但我不认为上面的代码读入数据框(或者,如果确实如此,我不能很好地理解文档)。看起来它一次只能为每个键存储一个值。我正在阅读的另一个帖子说,每个键可以存储多个值(使用.append()),但我不知道如何将它应用于这种情况。

感谢任何帮助,谢谢

3 个答案:

答案 0 :(得分:0)

这应该让你开始:

> mono --debug test.exe

答案 1 :(得分:0)

你不能真正做到第一部分 - “每个文件名都是字典的名字” - 没有一些真正的黑暗魔法。不,你的第一个代码示例实际上不起作用:)如果它有效,那将是一个非常糟糕的主意 - 考虑一个包含名为sysos等文件的目录:)

但是你可以在字典中嵌入字典,这些字典或多或少地实现了你想要的东西,只是语法略有不同:

rootDir = 'path'
my_csvs = {}
for dirName, subdirList, fileList in os.walk(rootDir, topdown=False):
    for fname in FileList
        my_csvs[fname] = {}

(对于“如何阅读csv文件”部分,请参阅@ rofls的答案,他的发布比我快一点)

答案 2 :(得分:0)

代码

这有效:

import os
import pandas as pd

path = 'path'
data = {}
for root, dir_names, file_names in os.walk(path):
    for file_name in file_names:
        full_file_name = os.path.join(root, file_name)
        data[file_name] = pd.read_csv(full_file_name, delim_whitespace=True).to_dict(orient='list')

使用os.path.walk沿着你的路径走,然后使用pandas。 您需要创建完整路径,否则pandas无法找到该文件,因为该文件不在当前工作目录中。

您需要告诉pd.read_csc()使用空格作为分隔符。方法to_dict(orient='list')将数据框转换为字典,其中列名称为键,浮点值列表。熊猫照顾NaNs。

如果您深入了解pandas,您可能希望保留数据框而不将其转换为字典。例如,这一行:

df = pd.read_csv('file1.txt', delim_whitespace=True)

为您提供此数据框:

enter image description here

它允许许多复杂的操作。

样本数据

file1.txt

A  B  C  D  E
0  3  6  1  6
1  6  1  0  5
3  4  9  8  5
7  6  4  0  9
7  6  NaN  0  9

file2.txt

A  B  C  D  E
0  3  6  1  6
7  6  NaN  0  9

输出

现在data包含:

{'file1.txt': {'A': [0, 1, 3, 7, 7],
  'B': [3, 6, 4, 6, 6],
  'C': [6.0, 1.0, 9.0, 4.0, nan],
  'D': [1, 0, 8, 0, 0],
  'E': [6, 5, 5, 9, 9]},
 'file2.txt': {'A': [0, 7],
  'B': [3, 6],
  'C': [6.0, nan],
  'D': [1, 0],
  'E': [6, 9]}}