gpt4 book ai didi

python - 加速文件解析

转载 作者:行者123 更新时间:2023-11-28 22:06:51 25 4
gpt4 key购买 nike

以下函数将 CSV 文件解析为字典列表,其中列表中的每个元素都是一个字典,其中值由文件标题(假定为第一行)索引。

这个函数非常非常慢,对于一个相对较小的文件(少于 30,000 行)需要大约 6 秒。

我怎样才能加快速度?

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)

这要快得多。然而,问题是它不会自动将明显是 float 和整数的东西转换为数字,而是将它们变成字符串。我该如何解决这个问题?

使用“Sniffer”类对我不起作用。当我在我的文件上尝试它时,出现错误:

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 将字段解析为它们的类型?

谢谢。

谢谢。

最佳答案

import ast

# find field types
for row in csv.DictReader(my_csvfile, delimiter=delimiter):
break
else:
assert 0, "no rows to process"
cast = {}
for k, v in row.iteritems():
for f in (int, float, ast.literal_eval):
try:
f(v)
cast[k] = f
break
except (ValueError, SyntaxError):
pass
else: # no suitable conversion
cast[k] = lambda x: x.decode(encoding)

# read data
my_csvfile.seek(0)

data = [dict((k.decode(encoding), cast[k](v)) for k, v in row.iteritems())
for row in csv.DictReader(my_csvfile, delimiter=delimiter)]

关于python - 加速文件解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2981563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com