我有一个以下格式的文件:
-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
答案 0 :(得分: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]
无论每行有多少列或行,这都会有效。
答案 1 :(得分: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列的行的三个第一列,并将所有值转换为float。
答案 2 :(得分: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
答案 3 :(得分: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