3

我想从一个(非常大的、空格分隔的、两列的)文本文件中读取数据到 Python 字典中。我尝试使用 for 循环来做到这一点,但这太慢了。更快的是使用 numpy loadtxt 将其读取到结构数组中,然后将其转换为字典:

data = np.loadtxt('filename.txt', dtype=[('field1', 'a20'), ('field2', int)], ndmin=1)
result = dict(data)

但这肯定不是最好的方法吗?有什么建议吗?

我需要其他东西的主要原因是以下不起作用:

data[0]['field1'].split(sep='-')

它导致错误消息:

TypeError: Type str doesn't support the buffer API

如果 split() 方法存在,为什么我不能使用它?我应该使用不同的 dtype 吗?还是有不同的(快速)方式来读取文本文件?还有什么我想念的吗?

版本:python 版本 3.3.2 numpy 版本 1.7.1

编辑: 更改data['field1'].split(sep='-')data[0]['field1'].split(sep='-')

4

2 回答 2

3

标准库split返回可变数量的参数,具体取决于在字符串中找到分隔符的次数,因此不太适合数组操作。顺便说一句,我的 char numpy 数组(我正在运行 1.7)没有split方法。

您确实有np.core.defchararray.partition,这很相似,但对矢量化以及所有其他字符串操作没有任何问题:

>>> a = np.array(['a - b', 'c - d', 'e - f'], dtype=np.string_)
>>> a
array(['a - b', 'c - d', 'e - f'], 
      dtype='|S5')
>>> np.core.defchararray.partition(a, '-')
array([['a ', '-', ' b'],
       ['c ', '-', ' d'],
       ['e ', '-', ' f']], 
      dtype='|S2')
于 2013-07-30T18:02:26.780 回答
1

因为: type(data[0]['field1'])<class 'numpy.bytes_'> ,当它有一个“正常”字符串作为参数时,该split()方法不起作用(这是一个错误吗?)

我解决它的方法:( data[0]['field1'].split(sep=b'-') 关键是把b放在'-'前面)

当然,Jaime 使用以下内容的建议非常有帮助: np.core.defchararray.partition(a, '-') 但在这种情况下b'-',也需要使其工作。

事实上,这里回答了一个相关问题:Type str does not support the buffer API虽然乍一看我没有意识到这是同一个问题。

于 2013-07-30T19:52:23.750 回答