【问题标题】:Python: import csv files, set dict name as filename, headers as keys, and columns as valuesPython:导入csv文件,设置dict name为文件名,headers为keys,columns为values
【发布时间】:2016-04-04 00:10:43
【问题描述】:

我有一个包含文件夹的目录,每个文件夹内大约有 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 名称设置为文件名,即:

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() )每个键可以存储多个值,但我不知道如何将其应用于这种情况。

感谢您的帮助,谢谢

【问题讨论】:

    标签: python csv dictionary pandas


    【解决方案1】:

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

    但是你可以将字典嵌套在字典中,这或多或少地达到了你想要的效果,只是语法略有不同:

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

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

    【讨论】:

    • 假设目录永远不会包含具有这些名称的文件(它不会)......这样做真的很糟糕吗?如果我这样做,RAM会有什么问题吗? CSV 真的很大。
    • 如果我将每个字典命名为ticker_fname,其中fname 是python 试图在该循环实例上读取的任何文件怎么办?我听说 eval() 可以做一些黑魔法,像这样重命名应该避免任何冲突。我试过 eval('ticker_ %s' % fname = {}) 但显然它不起作用;)
    • 是的,这将是一个非常糟糕、意外和不寻常的做法,是的,您可以使用 eval 来执行此操作(我猜),不,它不会过多影响性能或内存消耗
    • 我宁愿每次想访问它时都不必加载那个庞大的字典;对我来说,只调用个别词典会更容易。我阅读了 eval() 和 exec() ,我可以看到使用它会有什么危险。感谢您的帮助!
    【解决方案2】:

    这应该让你开始:

    import os, csv
    
    rootDir = 'path'
    items = {}
    for dirName, subdirList, fileList in os.walk(rootDir, topdown=False):
        for fname in fileList:
            with open(os.path.join(dirName,fname),'rb') as f:
                reader = csv.reader(f,delimiter=',')
                for row in reader:
                    try:
                        items[fname].append(row)
                    except KeyError:
                        items[fname] = list()
    
    print items
    

    【讨论】:

      【解决方案3】:

      代码

      这行得通:

      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 找不到该文件,因为该文件不在当前工作目录中。

      您需要告诉pd.read_csc() 使用空格作为分隔符。方法to_dict(orient='list') 将数据框转换为以列名作为键和浮点值列表的字典。 Pandas 负责处理 NaN。

      如果您对 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]}}
      

      【讨论】:

        猜你喜欢
        • 2013-02-04
        • 2018-10-01
        • 1970-01-01
        • 2018-08-04
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        相关资源
        最近更新 更多