1

我有一个以这种方式排序的文本文件:

1,1,1,
1,1,1,
1,1,1,

我的 Python 脚本会将文本文件中的每一行读取为字符串,基于逗号分隔,然后将其转换为十进制数以进行绘图和分析。我想创建一个由合并行组成的单个数组,如下所示:

[1,1,1
 1,1,1
 1,1,1]

我已经尝试使用 numpy 中的 vstack 方法,但似乎文本文件中有一个我无法摆脱的空白。

>>> 
[735019.6277, 0.0, 1.0178, 3.0, -2.104]
[735019.6278, 0.0, 15.361, 3.0, -2.078]
[735019.628, 0.0, 29.579, 3.0, -2.0682]
[]

由于这个空间,我无法将每一行加入一个数组。

这是代码:

from numpy import *
from scipy import *

file = open("results_test.txt", 'r')
line = file.readline()
data = line.split(',')
data[-1] = 0
table = data
x = 0
while (x < len(table)):
    table[x] = float(table[x])
    x = x+1
del(table[-1])
print table

while line:
    line = file.readline()
    data = line.split(',')
    data[-1] = 0
    x = 0
    while (x < len(data)):
        data[x] = float(data[x])
        x = x+1
    del(data[-1])
    print data
    table = vstack((table,data))

file.close()

这是错误:

Traceback (most recent call last):
  File "C:\Python27\read_txt.py", line 26, in <module>
    table = vstack((table,data))
  File "C:\Python27\lib\site-packages\numpy\core\shape_base.py", line 226, in vstack
    return _nx.concatenate(map(atleast_2d,tup),0)
ValueError: array dimensions must agree except for d_0

关于这个空间是什么以及如何摆脱它以便我可以使用 vstack 方法的任何想法?

4

5 回答 5

2

这是 while 循环容易出错的一个例子。尽量避免它们。

首先检查行是否为空 ( while line),然后读取新行 ( line = file.readline())。这使得支票相当无用。

相反,使用for line in file并删除该line = file.readline()行。

于 2012-06-03T01:07:00.993 回答
1

要删除您读取的数据中的额外空格,只需对每一行执行以下操作:

data = [x.strip() for x in line.split(',')]
于 2012-06-03T01:03:08.870 回答
1

试试这个:

data = []
for line in file:
    data.extend(int(x) for x in line.split(',') if not x.isspace())
于 2012-06-03T01:07:09.753 回答
1

正如我在上面的评论中提到的,使用strip( ) 来清理你的数据。改变你的

data = line.split(',')

data = line.split(',')
data = [i.strip() for i in data] # insert this line

您可能还想考虑使用此构造打开文件,其优点是它会在您完成后为您关闭文件,以及在发生异常的情况下。

with open("results_test.txt") as file:
    line = file.readline()
      ...
于 2012-06-03T01:07:09.893 回答
0
import itertools

parse_numbers = lambda s: map(float, filter(None, map(str.strip, s.split(','))))

with open('input.txt') as f:
    result = list(itertools.chain(*map(parse_numbers, f.readlines())))

print result
于 2012-06-03T07:37:20.423 回答