簡體   English   中英

Python,需要幫助將文本文件中的項目解析為列表

[英]Python, need help parsing items from text file into list

我正在嘗試解析文本文件中的項目並將其存儲到列表中。 數據看起來像這樣:

[(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

在這種情況下,您可以使用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和別處。

您可以使用字符串拆分方法和元組構造函數而無需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'>
>>>

從那里開始,它只是追加到列表中。

有些人可能不喜歡在這里使用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)]]

如果您從不完全信任的任何來源獲取此數據,則以下想法是個壞主意,但是如果數據將始終采用這種格式(並且僅包含數字作為元素),則這樣的事情就非常簡單了:

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

其他答案也很好,並且是針對此特定問題的簡單解決方案。 但是我假設,如果您在字符串操作方面遇到問題,那么簡單的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的定義,以將值存儲為浮點數。

zone = [ [float(val) for val in group.split(",")] for group in lineLst]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM