【问题标题】:Importing string as an ordered dictionary将字符串作为有序字典导入
【发布时间】:2016-01-14 19:20:39
【问题描述】:

我有一个没有扩展名的文件,其中包含这样的行(忽略行之间的间距,但每一行都是单独的行):

OrderedDict([('key1', u'value1'), ('key2', 'value2')])
OrderedDict([('key1', u'value1'), ('key2', 'value2')])
OrderedDict([('key1', u'value1'), ('key2', 'value2')])

当我将它导入 Python 时

snap_fh = open("C:\Users\.......")
for row in snap_fh:
    print(type(row))

行是"strings",我无法将其解析为OrderedDictionary

"OrderedDict([('key1', u'value1'), ('key2', 'value2'))])\n"

如何将其导入为OrderedDict

ast.literal_eval(row) 没用!

【问题讨论】:

  • ast.literal_eval 不起作用,因为它评估文字,而 OrderedDict(...) 不是文字。附带说明,如果您可以控制文件格式,则应使用不同的表示形式。
  • 您可以将文件的格式更改为只是元组对吗? [('key1', 'value1'), ('key2', 'value2')]
  • 乍得,我自己以流式方式创建了对象,并使用 Orderedict 来保留键的顺序......理想情况下,我想逐行创建一个 json,每行都是一个纯字典,但是我也不知道该怎么做。

标签: python string import ordereddictionary


【解决方案1】:

您应该使用正则表达式来进行更安全的评估:

import re
import ast
from collections import OrderedDict

def read(f):
    for s in f:
        m = re.match(r'^OrderedDict\((.+)\)$', s)
        if m:
            yield OrderedDict(ast.literal_eval(m.group(1)))

...
for d in read(snap_fh):
    print type(d)

【讨论】:

  • +1 因为我正要发布类似的东西,但你的更优雅和干净,ast.literal_eval 更安全...
【解决方案2】:

使用 eval 似乎效果很好

s = "OrderedDict([('key1', u'value1'), ('key2', 'value2')])"
a = eval(s, {'OrderedDict': OrderedDict})
print (a)

只有在您信任输入来源时才使用它 - 因为 eval 风险很大

【讨论】:

猜你喜欢
  • 2018-01-03
  • 2023-03-07
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
相关资源
最近更新 更多