将 CSV 文件转换为 Python 字典、数组和二进制文件
Convert CSV File into Python Dictionary, Array and Binary File
我有一个 CSV 文件,其中包含 tab-separated 数据和 headers 以及我想将其转换为向量字典的不同类型的数据。最后我想把字典转换成 numpy 数组,并以某种二进制格式存储它们,以便不同脚本快速检索。这是一个包含大约 700k 条记录和 16 列的大文件。以下是示例:
"answer_option" "value" "fcast_date" "expertise"
"a" 0.8 "2013-07-08" 3
"b" 0.2 "2013-07-08" 3
我已经开始使用 DictReader class 来实现它,我刚刚开始学习它。
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,但我还没有深入研究这些建议。理想情况下,我希望能够以 fast-to-load 格式存储数据,这样只用一个命令就可以很容易地从其他脚本加载数据,其中所有向量的可用方式与 Matlab/Octave。欢迎提出建议
编辑:数据以制表符分隔,字符串用引号括起来。
这会将 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')
我有一个 CSV 文件,其中包含 tab-separated 数据和 headers 以及我想将其转换为向量字典的不同类型的数据。最后我想把字典转换成 numpy 数组,并以某种二进制格式存储它们,以便不同脚本快速检索。这是一个包含大约 700k 条记录和 16 列的大文件。以下是示例:
"answer_option" "value" "fcast_date" "expertise"
"a" 0.8 "2013-07-08" 3
"b" 0.2 "2013-07-08" 3
我已经开始使用 DictReader class 来实现它,我刚刚开始学习它。
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,但我还没有深入研究这些建议。理想情况下,我希望能够以 fast-to-load 格式存储数据,这样只用一个命令就可以很容易地从其他脚本加载数据,其中所有向量的可用方式与 Matlab/Octave。欢迎提出建议
编辑:数据以制表符分隔,字符串用引号括起来。
这会将 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')