Python 加速文件解析
以下函数将CSV文件解析为字典列表,其中列表中的每个元素都是一个字典,其中的值由文件头(假定为第一行)索引 此函数非常慢,对于一个相对较小(少于30000行)的文件,需要约6秒的时间 我怎样才能加快速度Python 加速文件解析,python,csv,numpy,scipy,Python,Csv,Numpy,Scipy,以下函数将CSV文件解析为字典列表,其中列表中的每个元素都是一个字典,其中的值由文件头(假定为第一行)索引 此函数非常慢,对于一个相对较小(少于30000行)的文件,需要约6秒的时间 我怎样才能加快速度 def csv2dictlist_raw(filename, delimiter='\t'): f = open(filename) header_line = f.readline().strip() header_fields = header_line.split(
def csv2dictlist_raw(filename, delimiter='\t'):
f = open(filename)
header_line = f.readline().strip()
header_fields = header_line.split(delimiter)
dictlist = []
# convert data to list of dictionaries
for line in f:
values = map(tryEval, line.strip().split(delimiter))
dictline = dict(zip(header_fields, values))
dictlist.append(dictline)
return (dictlist, header_fields)
针对评论:
我知道有一个csv模块,我可以这样使用它:
data = csv.DictReader(my_csvfile, delimiter=delimiter)
这要快得多。然而,问题是它不会自动将显然是浮点数和整数的东西转换为数字,而是将它们转换为字符串。我怎样才能解决这个问题
使用“嗅探器”类对我不起作用。当我在我的文件上尝试时,我得到错误:
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", line 180, in sniff
raise Error, "Could not determine delimiter"
Error: Could not determine delimiter
我怎样才能让DictReader在很明显的情况下将字段解析为它们的类型
谢谢
谢谢。我发现您的代码有几个问题:
- 你为什么需要听写?密钥存储在每个dict实例中,这会增加内存消耗
- 您真的需要将所有实例都保存在内存中,还是可以选择使用
yield
- 尝试转换每个值需要时间,在我的选项中没有任何意义。如果有一列的值为“abc”和“123”,则最后一个值可能应该是字符串。因此,列的类型应该是固定的,并且应该使转换显式
- 即使您想使用转换逻辑:使用csv模块,然后转换值
import pandas as pd
# load everything in
df = pd.read_table(filename)
# coerce strings to numeric
df = df.convert_objects(convert_numeric=True)
你知道有一个对吗?如果有一个
deadbeef
,那么很明显它是一个基数16 int,对吗?Python不会猜测,你也不会。我同意它不应该全部加载到内存中——这很好,csv.DictReader不会这样做。但我确实认为dictreader应该明确地认识到,当一个字段的所有条目看起来都像5.34或0.05时,它应该是一个浮点,而不是一个字符串,而在我的文件中,它不会这样做(Sniff能够检测到分隔符/行终止符,但不是那样)我怎么能让明显的类型被推断出来呢?另外:我不想独立地转换每一行——我同意每一列的类型都应该是固定的,但是我不能让DictReader推断出一列有所有的浮点值,即使文件中该列的所有值都是浮点值。非常感谢。关于这一点的另一个问题是:如何让DictWriter从我读入的csv文件中序列化读卡器?我必须为此编写自定义方法吗?@user248237:writer.writerows(data)
序列化dicts列表。如果您的数据包含非ascii字符串,则需要类似于中的UnicodeWriter
的自定义编写器
import pandas as pd
# load everything in
df = pd.read_table(filename)
# coerce strings to numeric
df = df.convert_objects(convert_numeric=True)