我正在尝试使用numpy.loadtxt导入文本文件。数据文件包含超过1万行,其中大多数行有33列。但是,有几行只有一列而不是33.我尝试使用numpy.loadtxt和genfromtxt,但收到了错误消息。我怎么能在python中导入这样的数据文件?
答案 0 :(得分:5)
如果要忽略包含一列的行,可以将genfromtxt
与参数invalid_raise=False
一起使用。为此, first 行必须具有完整的列数。
例如,这是文件foo.txt
:
10 20 30
40 50 60
99
70 80 90
10 20 30
99
40 50 60
使用genfromtxt
和invalid_raise=False
阅读文件。生成警告,但返回具有三列的行的数据数组:
In [2]: genfromtxt('foo.txt', invalid_raise=False)
/Users/warren/anaconda/lib/python2.7/site-packages/numpy/lib/npyio.py:1695: ConversionWarning: Some errors were detected !
Line #3 (got 1 columns instead of 3)
Line #6 (got 1 columns instead of 3)
warnings.warn(errmsg, ConversionWarning)
Out[2]:
array([[ 10., 20., 30.],
[ 40., 50., 60.],
[ 70., 80., 90.],
[ 10., 20., 30.],
[ 40., 50., 60.]])
答案 1 :(得分:2)
genfromtxt
接受任何迭代或生成器,一次给它一行。因此,给它一个文件(名称),我会写一个小的生成器函数来读取文件,并跳过列数错误的行。
这种使用genfromtxt
的方式已在先前的SO问题中讨论过。最近一次要求从文件中读取所选行。
答案 2 :(得分:1)
对于此问题的大文件方面,您可以考虑使用pandas.read_table
,它允许您以块的形式读取文件并具有类似的文件读取实用程序。以下是使用Warren的示例文件的基本想法:
import pandas as pd
data_reader = pd.read_table("foo.txt", header=None, sep=r' ', dtype=float, chunksize=3)
for chunk in data_reader:
data = chunk.dropna()
print data.values
这会产生三个numpy数组:
[[ 10. 20. 30.]
[ 40. 50. 60.]]
[[ 70. 80. 90.]
[ 10. 20. 30.]]
[[ 40. 50. 60.]]
您需要传递的关键字read_table
与loadtxt
的关键字略有不同,例如,我在这里使用sep=r' '
来符合Warren的文件格式,我设置了dtype=float
,以便支持Nan
。这让我可以使用dropna()
方法删除这些行。最后,获取.values
属性会返回numpy.ndarray
。
关于调整read_table
的SO有很多其他帮助,所以我不打算在这里详细介绍。希望这会有所帮助。