考虑一个名为“new.txt”的文本文件,其中包含以下元素:
μm
∂r
∆λ
在Python2.7中,我可以通过键入:
>>> import codecs
>>> f = codecs.open('new.txt', encoding='utf-8')
>>> lines = [line.strip() for line in f2.readlines()]
>>> lines
[u'\u03bcm', u'\u2202r', u'\u2206\u03bb']
>>> print lines[0]
μm
到目前为止还不错。我可以通过以下方式轻松地将此列表转换为numpy数组:
>>> import numpy as np
>>> arr = np.array(lines)
>>> arr
array([u'\u03bcm', u'\u2202r', u'\u2206\u03bb'],
dtype='<U2')
问题是,我不能通过numpy的loadtxt函数直接读取这个文件:
>>> np.loadtxt('new.txt', dtype=np.unicode_)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/numpy/lib/npyio.py", line 805, in loadtxt
X = np.array(X, dtype)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
直接将这个文件读入numpy的正确方法是什么?
谢谢。
如果要使用
loadtxt
,可以先加载原始字节数组,然后解码:或指定用于解码的转换器:
然而,在Sven的答案中使用
fromiter
可能比loadtxt
更有效。在内存中,unicode字符串表示为UCS-2或UCS-4,这取决于Python解释器的编译方式。您的文件是在UTF-8中编码的,因此在将其映射到NumPy数组之前需要重新编码。
loadtxt()
无法为您重新编码——毕竟NumPy主要针对数值数组。假设每行的字符数相同,也可以使用更有效的变量
这将在字符串中包含换行符。不包括它们,使用
编辑:如果文件行的长度不同,并且您希望避免中间列表,则可以使用
不过,我不确定这是否会在内部创建一些临时列表。
相关问题 更多 >
编程相关推荐