如何导入行中不规则列的文本数据文件?

时间:2015-08-17 02:54:40

标签: python numpy

我正在尝试使用numpy.loadtxt导入文本文件。数据文件包含超过1万行,其中大多数行有33列。但是,有几行只有一列而不是33.我尝试使用numpy.loadtxt和genfromtxt,但收到了错误消息。我怎么能在python中导入这样的数据文件?

3 个答案:

答案 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

使用genfromtxtinvalid_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问题中讨论过。最近一次要求从文件中读取所选行。

How to read only specific rows from a text file?

答案 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_tableloadtxt的关键字略有不同,例如,我在这里使用sep=r' '来符合Warren的文件格式,我设置了dtype=float,以便支持Nan。这让我可以使用dropna()方法删除这些行。最后,获取.values属性会返回numpy.ndarray。 关于调整read_table的SO有很多其他帮助,所以我不打算在这里详细介绍。希望这会有所帮助。