4

我有一个格式如下的文件:

-2000 -2000 -2000 # (*THE FRAME, origin point*), 1
-2000 379 -2000 # 2
 2000 379 -2000 # 3
 2000 -2000 -2000 # 4
-2000 -2000 -2000 # 1
j
 2000 379 -1190 # 7
 2000 -2000 -1190 # 8
-2000 -2000 -1190 # 5

我需要在 python 中读取此文件并将其存储在以下格式的列表中:

[[[-2000, -2000, -2000], [-2000 379 -2000], [2000, 379, -2000], [2000, -2000, -2000], [-2000, -2000, -2000]],[[2000, 379, -1190], [2000, -2000, -1190], [-2000, -2000, -1190]]] 

到目前为止,我已读取文件并将值存储在列表中

file = open('filename', 'r')
vlist = file.readlines()
file.close

然后我将每个“j”值转换为 [-1,-1,-1] 并将该值用作列表之间的中断。

points = []
points = [list(map(int,elem.split())) if elem.strip().lower() != "j" else [-1, -1, -1]     for elem in vlist]

然后使用 itertools 我可以将此列表拆分为每次 [-1,-1,-1] 出现在列表中的组:

pointLists = [list(group) for val, group in groupby(points, lambda x: x == [-1,-1,-1]) if not val]

我相信这会给我我想要的输出,但是它不适用于我显示在顶部的文件示例,因为它不会删除 # 和它后面的值。

我不确定如何从列表中删除 # 和后面的值,所以任何帮助都会有很大帮助谢谢。

enter code here
4

4 回答 4

3

由于您实际上并不需要[-1,-1,-1]介于两者之间的最终结果:

with open('stuff') as f:
    list1 = [line.strip().split('#')[0].split() for line in f]
    print [[map(int, var) for var in g] for k, g in groupby(list1, key=lambda x: len(x)==1) if k != 1]

无论每行有多少列或行,这都会起作用。

于 2013-10-26T12:26:35.580 回答
0

该代码得到你所需要的

file = open('test', 'r')
lines = file.readlines()
file.close

a = []
b = []
t = a
for line in lines:
    temp = line.split('#')
    if len(temp) == 1:
        t = b
        continue
    t.append(map(int, temp[0].strip().split(' ')))

list = [a,b]
print list
于 2013-10-26T12:12:15.240 回答
0

使用正则表达式...

import re
f = open("file.txt")
data = f.readlines()
f.close()
output = []
final = []
for line in data:
    l = re.findall("[0-9\-]+|[j]", re.sub("[#](.+)", "", line))
    if l == ['j']:
        final.append(output)
        output = []
        continue
    output.append([float(i) for i in l])
if output:
    final.append(output)
for i in final: print i
于 2013-10-26T12:17:36.800 回答
0

您可以尝试以下方法:

with open(filename) as f:
    lines = [l.split() for l in f.readlines()]
lines = [map(float, l[:3]) for l in lines if len(l)>=3]

这将只占用 >= 3 列的行的前三列,并将所有值转换为浮点数。

于 2013-10-26T12:10:02.657 回答