python:ValueError:加载字典结构时字符串格式错误

python:ValueError:加载字典结构时字符串格式错误,python,dictionary,eval,Python,Dictionary,Eval,我试图逐行读取以下数据,每行都是python字典格式: test.txt: {u'FirstName': u'John', u'Title': u'Mr', u'LastName': u'Doe', u'LastSeenDate': datetime.datetime(2013, 11, 11, 0, 0)} {u'FirstName': u'Mary', u'Title': u'Ms', u'LastName': u'Doe', u'LastSeenDate': datetime.dateti

我试图逐行读取以下数据,每行都是python字典格式:

test.txt:

{u'FirstName': u'John', u'Title': u'Mr', u'LastName': u'Doe', u'LastSeenDate': datetime.datetime(2013, 11, 11, 0, 0)}
{u'FirstName': u'Mary', u'Title': u'Ms', u'LastName': u'Doe', u'LastSeenDate': datetime.datetime(2013, 11, 12, 0, 0)}
以下是代码和错误:

with open("test.txt", "r") as ins:
    for line in ins:
        data =ast.literal_eval(line)
        print(data["Title"])

ValueError回溯(最近一次调用)
在()
21
22如果uuuu name uuuuuuu=='\uuuuuuuuu main\uuuuuuuuuu':
--->23主要内容()
大体上
14打开(“test.txt”、“r”)作为ins:
15对于线路输入ins:
--->16数据=ast.literal\u eval(行)
17打印(数据[“标题”])
18
/literal_eval(节点_或字符串)中的System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.pyc
78返回左-右
79 raise VALUERROR('格式错误的字符串')
--->80返回\u转换(节点\u或字符串)
81
82
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.pyc in_convert(节点)
61 elif isinstance(节点,Dict):
62返回k,v的dict((_convert(k),_convert(v))
--->63英寸(node.keys、node.values))
64 elif isinstance(节点,名称):
65如果_safe_名称中的node.id:
/((k,v))中的System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.pyc
60返回列表(映射(_convert,node.elts))
61 elif isinstance(节点,Dict):
--->62返回k,v的dict((_convert(k),_convert(v))
63英寸(node.keys、node.values))
64 elif isinstance(节点,名称):
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.pyc in_convert(节点)
77.其他:
78返回左-右
--->79 raise VALUERROR('格式错误的字符串')
80返回\u转换(节点\u或字符串)
81
ValueError:格式不正确的字符串

如何避免格式错误的字符串错误,以及解析这些数据的正确方法是什么?

我会使用,因为这是您的数据,所以您应该能够信任它

转储报告:

from pickle import dump   # cPickle in case of Python2

with open('report.pickle', 'wb') as pickle_stream:
    for row in generate_rows():
        dump(row, pickle_stream, 2)  # The version must be at least 1.
阅读报告:

from pickle import load   # cPickle in case of Python2

with open('report.pickle', 'wb') as pickle_stream:
    while True:
        try:
            row = load(pickle_stream)
        except EOFError:
            break

        do_something_with(row)

test.txt
来自哪里?看起来您信任输入,所以也许您可以使用pickle?
datetime。datetime(2013,11,11,0,0)
不是Python文本语法,
literal\u eval
不处理它。@Kay,test.txt是sql查询报告的输出。每一行都是一个报告并写入一个文件。
literal\u eval
在它将解析的内容上受到限制(但这就是重点)。提供的字符串或节点可能只包含以下Python文本结构:字符串、字节、数字、元组、列表、dicts、set、boolean和None。如果您控制写入txt文件的内容,请让它将datetime转换为字符串表示形式。这就是我编写输出的方式:f.write(str(report)+'\n'),其中report是sql响应。没有datetime我怎么写呢?谢谢!生成的行应该是字符串吗?或者它需要任何特定的格式或结构?@Edamame,它可以是任何东西的旁边,这就是pickle的优点。加载(“取消勾选”)后,将返回与您转储的数据类型相同的dict、string、datetime.datetime列表。因此,除非方便,否则不要转换输入。(1:不适用于打开的文件对象、Sqlalchmy的ResultProxy和类似的易失性数据。)
from pickle import load   # cPickle in case of Python2

with open('report.pickle', 'wb') as pickle_stream:
    while True:
        try:
            row = load(pickle_stream)
        except EOFError:
            break

        do_something_with(row)