Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加速文件解析_Python_Csv_Numpy_Scipy - Fatal编程技术网

Python 加速文件解析

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(

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

此函数非常慢,对于一个相对较小(少于30000行)的文件,需要约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)
这要快得多。然而,问题是它不会自动将显然是浮点数和整数的东西转换为数字,而是将它们转换为字符串。我怎样才能解决这个问题

使用“嗅探器”类对我不起作用。当我在我的文件上尝试时,我得到错误:

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)