我有一个包含文件夹的目录,每个文件夹里面大约有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()),但我不知道如何将它应用于这种情况。
感谢任何帮助,谢谢
答案 0 :(得分:0)
这应该让你开始:
> mono --debug test.exe
答案 1 :(得分:0)
你不能真正做到第一部分 - “每个文件名都是字典的名字” - 没有一些真正的黑暗魔法。不,你的第一个代码示例实际上不起作用:)如果它有效,那将是一个非常糟糕的主意 - 考虑一个包含名为sys
,os
等文件的目录:)
但是你可以在字典中嵌入字典,这些字典或多或少地实现了你想要的东西,只是语法略有不同:
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)
为您提供此数据框:
它允许许多复杂的操作。
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]}}