2017-04-07 108 views
0

字典類型元素的字符串我想要解析的文章看串,(稱之爲字符串,因爲它的類型是str),並從它的字典元素得到一些信息:解析列表尋找具有蟒蛇

"[{""isin"": ""US51817R1068"", ""name"": ""LATAM Airlines Group SA""}, {""isin"": ""CL0000000423"", ""name"": ""LATAM Airlines Group SA""}, {""isin"": null, ""name"": ""LATAM Airlines Group SA""}, {""isin"": ""BRLATMBDR001"", ""name"": ""LATAM Airlines Group SA""}]" 

我用ast packege和literal_eval轉換成列表並解析它。但與ValueError: malformed string錯誤。

下面是相同的代碼:

company_list = ast.literal_eval(line[18]) 
print company_list 
for i in company_list: 
    #print type(i) 
    print i["isin"] 

這裏線[18]以上的字符串。

或者如何忽略這樣的列表lookign字符串,如果它包含任何空值,就像它一樣。

PS:行[18]是我想要讀取的csv的列號。

+0

您確定您的報價餘額是正確的嗎? – 9000

+1

正如通過語法突出顯示的那樣,這不是單個字符串。請提供[mcve]。 – TigerhawkT3

+0

這看起來像json。 – Rishav

回答

1

好吧,剛開始時說:哇,比我想象的要難!

所以兩個問題字符串:

  1. 當Python打印的字符串時,它會刪除所有雙引號,因爲解析器感到困惑 -
  2. null類型,所以我們必須將它們添加回。在Python中不存在,因此我們需要將其更改爲None

所以這裏的代碼:

import re 
import ast 

data_in = "[{""isin"": ""US51817R1068"", ""name"": ""LATAM Airlines Group SA""}, {""isin"": ""CL0000000423"", ""name"": ""LATAM Airlines Group SA""}, {""isin"": null, ""name"": ""LATAM Airlines Group SA""}, {""isin"": ""BRLATMBDR001"", ""name"": ""LATAM Airlines Group SA""}]" 

# Make a copy for modification. 
formatted_data = data_in 

# Captures the positional information of adding and removing characters. 
offset = 0 

# Finds all key and values. 
p = re.compile("[\{\:,]([\w\s\d]{2,})") 
for m in p.finditer(data_in): 
    # Counts the number of characters removed via strip(). 
    strip_val = len(m.group(1)) - len(m.group(1).strip()) 
    # Adds in quotes for a single match. 
    formatted_data = formatted_data[:m.start(1)+offset] + "\"" + m.group(1).strip() + "\"" + formatted_data[m.end(1)+offset:] 
    # Offset will always add 2 ("+name+"), minus whitespace removed. 
    offset += 2 - strip_val 

company_list = ast.literal_eval(formatted_data) 

# Finds 'null' values and replaces them with None. 
for item in company_list: 
    for k,v in item.iteritems(): 
     if v == 'null': 
      item[k] = None 

print company_list 

這是寫在Python 3,我改變了我記得回2位,可能會有小的誤差。

結果是dictlist對象:

[{'isin': 'US51817R1068', 'name': 'LATAM Airlines Group SA'}, {'isin': 'CL0000000423', 'name': 'LATAM Airlines Group SA'}, {'isin': None, 'name': 'LATAM Airlines Group SA'}, {'isin': 'BRLATMBDR001', 'name': 'LATAM Airlines Group SA'}] 

有關正則表達式中使用的詳細信息,請參閱here

+1

感謝它的工作 – ggupta