2017-04-07 71 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