【问题标题】:Convert CSV File into Python Dictionary, Array and Binary File将 CSV 文件转换为 Python 字典、数组和二进制文件
【发布时间】:2019-08-11 08:24:24
【问题描述】:

我有一个制表符分隔数据的 CSV 文件,其中包含不同类型的标题和数据,我想将其转换为向量字典。最终,我想将字典转换为 numpy 数组,并将它们以某种二进制格式存储,以便不同脚本快速检索。这是一个包含大约 700k 记录和 16 列的大文件。以下为示例:

"answer_option" "value" "fcast_date"    "expertise"
"a" 0.8 "2013-07-08"    3
"b" 0.2 "2013-07-08"    3

我已经开始使用 DictReader 类来实现这一点,我刚刚学习。

import csv
with open( "filename.tab", 'r') as records:
    reader = csv.DictReader( records, dialect='excel-tab' )
    row = list( reader )
    n = len( row )
    d = {}
    keys = list( row[0] )
    for key in keys :
        a = []
        for i in range(n):
            a.append( row[i][key] )
        d [key] = a

给出结果

{'answer_option': ['a', 'b'],
'value': ['0.8', '0.2'],
'fcast_date': ['2013-07-08', '2013-07-08'],
'expertise': ['3', '3']}

除了必须从数值中清除包围它们的引号字符的小麻烦之外,我认为也许有一些现成的东西。我还想知道是否有任何东西可以直接从文件中提取到 numpy 向量中,因为我不需要在字典中转换我的数据。

我查看了 SciPy.org,搜索 CSV 时也提到了 HDF5 和 genfromtxt,但我还没有深入研究这些建议。理想情况下,我希望能够以快速加载的格式存储数据,这样就可以很容易地从其他脚本中加载,只需一个命令,所有向量都可以在 Matlab 中以相同的方式使用/八度。欢迎提出建议


编辑:数据以制表符分隔,用引号括起来的字符串。

【问题讨论】:

    标签: python csv dictionary numpy-ndarray


    【解决方案1】:

    这会将 csv 读入 Pandas 数据框并删除引号:

    import pandas as pd
    import csv
    import io
    
    with open('data_with_quotes.csv') as f_input:
        data = [next(csv.reader(io.StringIO(line.replace('"', '')))) for line in f_input]
    
    df = pd.DataFrame(data[1:], columns=data[0])
    print(df)
    
      answer_option value  fcast_date expertise
    0              a   0.8  2013-07-08         3
    1              b   0.2  2013-07-08         3
    

    您可以使用df.values 轻松地将数据转换为 numpy 数组:

    array([['a', '0.8', '2013-07-08', '3'],
           ['b', '0.2', '2013-07-08', '3']], dtype=object)
    

    要以二进制格式保存数据,我建议使用 Hdf5:

    import h5py
    
    with h5py.File('file.hdf5', 'w') as f:
        dset = f.create_dataset('default', data=df)
    

    要加载数据,请使用以下命令:

    with h5py.File('file.hdf5', 'r') as f:
       data = f['default']
    

    您还可以使用 Pandas 以二进制格式保存和加载数据:

    # Save the data
    df.to_hdf('data.h5', key='df', mode='w')
    
    # Load the data
    df = pd.read_hdf('data.h5', 'df')
    

    【讨论】:

    • 谢谢!我忘记强调数据是制表符分隔的(我刚刚进行了编辑)。因此,我将参数 dialect='excel-tab' 添加到您的 csv.reader 代码中,它似乎正在工作。
    • 发现line.replace('"', '')对dialect='excel-tab'是多余的,所以csv.reader语句简化为csv.reader(io.StringIO(行), dialect='excel-tab')
    • 尝试以 HDF5 格式保存时出现错误:“TypeError: Object dtype dtype('O') has no native HDF5 equivalent”。是否有可能被不寻常的日期格式抛弃?该消息之前是对 h5py.h5t.py_create 的 3 次调用,最后一个是:“文件“h5py\h5t.pyx”,第 1688 行,在 h5py.h5t.py_create 中”
    • this issue 看来,dtype('O') 用于不是任何内置 Numpy 类型的 Python 对象。如果这与 HDF5 不兼容,您可以尝试将数据类型设置为对象以外的其他类型(字符串、浮点数、整数)。您可以使用df.dtypes检查数据框中每一列的数据类型,也可以使用df['column'] = df['column'].astype(str)进行设置。
    • df.dtypes 返回所有 dtype 对象的 Pandas,根据 Pandas 文档,这些对象是字符串。我能够将数字更改为 dtype“int”或 dtype“float64”。但是,由于文字需要保留字符串,我将不得不做一些 HDF5 转换,对我来说仍然很模糊。在一个单独的线程中,转换是这样处理的:stackoverflow.com/questions/23220513/…
    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2017-03-27
    • 2018-08-13
    • 2021-12-22
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多