【问题标题】:How to search for dict from a big text file using python如何使用python从大文本文件中搜索dict
【发布时间】:2015-08-21 18:32:36
【问题描述】:

我有巨大的文本文件需要解析。

文件的每一行包含一些文本和字典。我只关心dict数据。

文件包含以下格式的日志

my data : {"a":1, "b":2, "c": 3}
my data : {"a":23, "b": 44, "c": 565}
my_data : {"a":1233, "b": 21, "c":544}

所以,从上面的数据我只是在寻找 dict。

我试过了

f = open(‘text.file’,'r’)
my_dict = eval(f.read())

但它给了我错误,因为该行的初始部分是字符串。 所以,我的问题是从文件中提取 dict 的最佳方法是什么。

【问题讨论】:

  • 您的f = open(‘text.file’,'r’) 行正在使用非ASCII“智能引号”。看看左引号与右引号的曲线有何不同? Python 不支持这些。只需使用常规撇号即可。
  • 如果my_data写成字符串(即写成"my_data"),那么看起来你的文件实际上是JSON格式,这可以让你的生活轻松很多: 只需使用 json 模块解码文件,它会为您解析字典。
  • 你的操作系统是windows?

标签: python dictionary


【解决方案1】:

您可以使用re 模块

import re
text = """my data : {"a":1, "b":2, "c": 3}
          my data : {"a":23, "b": 44, "c": 565}
          my_data : {"a":1233, "b": 21, "c":544}"""
dict = re.compile(r"{[^}]*?}", re.I)
matches = dict.finditer(text)
for match in matches:
    my_dict = eval(match.group())
    print(my_dict) 

给你

{'b': 2, 'c': 3, 'a': 1}
{'b': 44, 'c': 565, 'a': 23}
{'b': 21, 'c': 544, 'a': 1233}

【讨论】:

    【解决方案2】:

    看起来你在字符串之间有一些分隔符,所以 str.split() 是你的朋友。

    之后,考虑使用 AST 模块而不是 eval。与盲目评估相比,它带来的安全风险要小。

    >>>import ast
    >>> a = ast.literal_eval("{'a':1}")
    >>> type(a)
    <class 'dict'>
    >>> a
    {'a': 1}
    

    【讨论】:

      【解决方案3】:

      eval 是bad

      我会这样做:

      import json
      
      dicts = []
      with open('text.file', 'r') as f:
          for line in f.readlines():
              if not line: continue
              _, dict_str = line.split(':', 1)
              dict_str = dict_str.strip()
              dict = json.load(dict_str)
              dicts.append(dict)
      

      【讨论】:

      • 谢谢你的帮助,但是 line = f.reallines 会给我 list..so 如何使用 split 与它
      猜你喜欢
      • 2012-10-03
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多