我正在尝试解析文本文件中的项目并将它们存储到列表中。数据看起来像这样:
[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)]
[(10, 3, 1), (11, 3, 1), (12, 3, 1), (13, 3, 1), (13, 4, 1)]
[(10, 3, 5), (11, 3, 5), (12, 3, 5), (13, 3, 5), (13, 4, 5), (13, 5, 5), (13, 6, 5)]
[(6, 13, 5), (7, 13, 5), (8, 13, 5), (8, 14, 5), (7, 14, 5), (6, 14, 5), (6, 14, 6)]
我能够删除“[”和“]”,但无法将其余信息存储到列表中,格式如下: (x,y,z)。有什么帮助吗?
def dataParser(fileName):
zoneList=[]; zone=[]
input=open(fileName,"r")
for line in input:
vals = line.strip("[")
newVals = vals.strip("]\n")
print newVals
v=newVals[0:9]
zone.append(v)
input.close()
return zone
答案 0 :(得分:6)
在这种特殊情况下,您可以使用ast.literal_eval
:
>>> with open("list.txt") as fp:
... data = [ast.literal_eval(line) for line in fp if line.strip()]
...
>>> data
[[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)], [(10, 3, 1), (11, 3, 1), (12, 3, 1), (13, 3, 1), (13, 4, 1)], [(10, 3, 5), (11, 3, 5), (12, 3, 5), (13, 3, 5), (13, 4, 5), (13, 5, 5), (13, 6, 5)], [(6, 13, 5), (7, 13, 5), (8, 13, 5), (8, 14, 5), (7, 14, 5), (6, 14, 5), (6, 14, 6)]]
这是eval
的“安全”版本。然而,正是由于这个原因,它并不是一般的。如果您正在生成此输入,则可能需要查看另一种保存数据的方式(“序列化”),无论是使用pickle
还是类似JSON
- 还有很多示例使用这两者你可以在SO和其他地方找到。
答案 1 :(得分:3)
你可以在没有eval的情况下使用字符串split方法和元组构造函数来完成:
>>> st = "[(0,0,0), (1,0,0)]"
>>> splits = st.strip('[').strip(']\n').split(', ')
>>> splits
['(0,0,0)', '(1,0,0)']
>>> for split in splits:
... trimmed = split.strip('(').strip(')')
... tup = tuple(trimmed.split(','))
... print tup, type(tup)
...
('0', '0', '0') <type 'tuple'>
('1', '0', '0') <type 'tuple'>
>>>
从那里开始,它只是附加到列表中。
答案 2 :(得分:2)
有些人可能不喜欢在这里使用eval()
,但您可以使用它在一行中执行此操作:
In [20]: lis=eval("[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)]")
In [23]: lis
Out[23]: [(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)]
使用文本文件:
In [44]: with open('data.txt') as f:
....: lis=[eval(x.strip()) for x in f]
....: print lis
....:
....:
[[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)], [(10, 3, 1), (11, 3, 1), (12, 3, 1), (13, 3, 1), (13, 4, 1)], [(10, 3, 5), (11, 3, 5), (12, 3, 5), (13, 3, 5), (13, 4, 5), (13, 5, 5), (13, 6, 5)], [(6, 13, 5), (7, 13, 5), (8, 13, 5), (8, 14, 5), (7, 14, 5), (6, 14, 5), (6, 14, 6)]]
答案 3 :(得分:0)
如果您从任何您不完全信任的来源获取此数据,但如果数据始终采用此格式(并且仅包含数字作为元素),则以下是一个不好的主意非常简单:
collect = []
for line in input:
collect.append(eval(line))
答案 4 :(得分:0)
其他答案工作得很好,是解决这个特定问题的简单方法。但我假设如果您遇到字符串操作问题,那么下次遇到此问题时,简单的eval()函数将无法帮助您。
作为一般规则,当您接触到这样的问题时,首先想要做的就是定义分隔符。
[(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0), (5, 0, 0), (6, 0, 0)]
在这里你可以看到“),(”是组之间的潜在分隔符,一个简单的逗号(“,”)是值之间的分隔符。接下来你想看看你需要删除什么,正如你所指出的,括号(“[”和“]”)提供的信息很少。我们也可以看到,因为我们正在处理数值,所有间距都给我们提供了很少的信息,需要删除。
在此信息的基础上,我以一种返回您要查找的值的方式设置 dataParser 函数:
fileName= "../ZoneFinding/outputData/zoneFinding_tofu_rs1000.txt"
def dataParser(fileName):
with open(fileName,"r") as input
zoneLst = []
for line in input:
#First remove white space and the bracket+parenthese combos on the end
line = line.replace(" ","").replace("[(","").replace(")]","")
#Now lets split line by "),(" to create a list of strings with the values
lineLst = line.split("),(")
# At this point lineLst = ["0,0,0" , "1,0,0", "2,0,0", ...]
#Lastly, we will split each number by a "," and add each to a list
zone = [group.split(",") for group in lineLst]
zoneLst.append(zone)
return zoneLst
在上面的示例中,所有值都存储为字符串。你也可以替换 使用下面的代码定义区域,将值存储为浮点数。
zone = [ [float(val) for val in group.split(",")] for group in lineLst]