2015-06-21 65 views
0

我有一個自動生成的Python列表。它的格式如下:長長的Python列表如何被檢查和修復?

[(186, 25, 192, 255), (184, 25, 192, 255), (184, 27, 193, 255), (184, 29, 193, 255), (184, 31, 193, 255), (183, 32, 192, 255), (182, 33, 191, 255), ... many further elements... ] 

這是一個很長的列表,它完全包含在一個大約100 MB的文件中。這個列表有可能以某種方式變形。我想要檢測到哪裏的格式不正確,以便通過用(0, 0, 0, 255)替換任何有問題的元素來修復它。

我已編輯的文件,使其包含以下內容:

list1 = [(186, 25, 192, 255), ... many further elements... 
print("list length: {length}".format(length = len(list1))) 

當我運行通過Python的文件,完整列表打印,然後有很多空白的,然後是錯誤消息「的SyntaxError :語法無效「,指向空格的插入符號。

由於列表太長,需要一個編程方法來驗證列表並修復它。什麼是這樣做的好方法?

+0

看起來像一堆像素。我想知道爲什麼它不存儲在圖像中。列表如何變形?它包含一些無效的語法? – nneonneo

+1

不知道,如果代碼大小有限制。但爲什麼你不把數字保存在csv文件中呢? – Daniel

+0

所以你說這個列表是以字符串形式給出的,對吧? – Falko

回答

1

這是一個非常不幸的格式,您的數據被傾倒;我認爲其目的是在閱讀python時評估它,這是一種可怕的方法(你現在看到一個原因)。

假設你沒有權限訪問Unix工具,這將使檢查文件的語法變得微不足道,在Python中執行它的方法是檢查元組(或者說,代表它們的字符串)時間。因爲它似乎沒有任何新行,你必須一次讀取整個事情,把它分解一下自己:

import re 
with open("datadump.txt") as fp: 
    text = fp.read() 
parts = text[2:-2].split("), (") 
for n, part in enumerate(parts): 
    if not re.match(r"^\d+, \d+, \d+, \d+$", part): 
     print("The %d-th tuple is malformed: %s" % (n, part)) 

你可能會在第一個和最後一個元組僞消息,如果空格不完全符合我的假設(例如,如果文件末尾有換行符,應該是text[2:-3]),但它應該足以指出您的問題。

PS。 FWIW,一個更好的格式本來只是打印出來的數字四線,沒有任何裝飾:

186 25 192 255 
184 25 192 255 
184 27 193 255 
etc. 

它需要幾行代碼寫出來,背讀,但它的很多更好地與長期合作 - 並且您可以輕鬆閱讀並驗證一行一行。

+0

非常感謝您的幫助和您的明確解釋!這工作完美! :)數據是由機器學習算法創建的,我需要一些格式,爲了訓練算法和修復輸出的目的,這兩種格式都很簡單,所以我使用簡單的像素列表。幸運的是,算法在整個事情中只有5個小錯誤。 – d3pd

+0

很高興工作。我添加了一個筆記,內容是我會用到的。 – alexis