Python,需要帮助将项目从文本文件解析到列表中吗

Python,需要帮助将项目从文本文件解析到列表中吗,python,parsing,Python,Parsing,我试图解析文本文件中的项目并将其存储到列表中。数据如下所示: [(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,

我试图解析文本文件中的项目并将其存储到列表中。数据如下所示:

[(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
有些人可能不喜欢在此处使用,但您可以在一行中使用它:

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)]]
有些人可能不喜欢在此处使用,但您可以在一行中使用它:

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)]]

在这种特殊情况下,您可以使用
ast.literal\u 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和其他地方都有很多使用这两种方式的示例。

在这种特殊情况下,您可以使用
ast.literal\u 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和其他地方找到大量使用这两种格式的示例。

如果您从任何您不完全信任的源获取此数据,但如果数据始终采用此格式(并且仅包含数字作为元素),则以下是一个坏主意类似这样的事情非常简单:

collect = []
for line in input:
    collect.append(eval(line))

如果您从任何您不完全信任的来源获取此数据,那么以下是一个坏主意,但是如果数据始终采用这种格式(并且只包含数字作为元素),那么类似这样的方法非常简单:

collect = []
for line in input:
    collect.append(eval(line))

您可以使用字符串拆分方法和元组构造函数在不使用eval的情况下执行此操作:

>>> 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'>
>>>
>>st=“[(0,0,0),(1,0,0)]”
>>>splits=st.strip('[')。strip(']\n')。split(','))
>>>分裂
['(0,0,0)', '(1,0,0)']
>>>对于拆分中的拆分:
...   修剪=拆分.strip(“(”).strip(“)”)
...   tup=tuple(trimmed.split(','))
...   打印tup,类型(tup)
...
('0', '0', '0') 
('1', '0', '0') 
>>>

从这里开始,它只是附加到一个列表。

您可以使用字符串拆分方法和元组构造函数,而无需eval:

>>> 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'>
>>>
>>st=“[(0,0,0),(1,0,0)]”
>>>splits=st.strip('[')。strip(']\n')。split(','))
>>>分裂
['(0,0,0)', '(1,0,0)']
>>>对于拆分中的拆分:
...   修剪=拆分.strip(“(”).strip(“)”)
...   tup=tuple(trimmed.split(','))
...   打印tup,类型(tup)
...
('0', '0', '0') 
('1', '0', '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]

其他答案很好,是这个特定问题的简单解决方案。但我假设,如果您在字符串操作方面遇到问题,那么下次遇到这个问题时,简单的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]

为什么使用eval不安全?只有在执行不信任的数据时才不安全。如果某个恶作剧者在数据文件中添加了行
\uuu import\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu引用的是,我认为日常使用中的危险往往被夸大了,但这是少数人的观点。嗯……有趣的是。尽管你提供的解决方案对我来说太先进了。尽管一句话尽可能简洁,而且效果很好,但对我来说还是有点难以理解。我仍然不习惯使用usi还没有定义不同的类,但只是基本类。不过还是要谢谢你!@user1518600:如果你觉得这有点精简,你可能会想使用(并接受)Brenden的解决方案。为什么使用eval不安全?只有在