解析字典时意外的EOF

0 投票
1 回答
4546 浏览
提问于 2025-04-18 03:35

大家好,祝你们有个愉快的一天!

我正在做一个数据解析器。这个解析器需要从网页上提取数据,把它存储到一个.txt文件中,然后运行一个模块来解析这个.txt文件,并创建一个我想要格式的数据的.xls文件。

我有三个模块:

第一个是一个“爬虫”,它只提取网页的html内容。

第二个模块解析html,并创建一个包含所有所需数据的字典。

第三个模块从字典中提取数据,并根据这些数据创建一个.xls文件。

每个模块单独运行都没问题。也就是说,如果我手动一个一个执行它们,是不会出错的。

问题是当我想让这个过程自动化时(从第一个模块调用第二个模块,再从第二个模块调用第三个模块),在最后一步时就崩溃了:

Traceback (most recent call last):
  File "/home/desprit/Documents/Python/examples/pg_parsing/data_parser.py", line 296, in <module>
    data_parser('verona')
  File "/home/desprit/Documents/Python/examples/pg_parsing/data_parser.py", line 285, in data_parser
    next_step(where)
  File "/home/desprit/Documents/Python/examples/pg_parsing/data_parser.py", line 292, in next_step
    save_to_excel_01.save_to_excel(where)
  File "/home/desprit/Documents/Python/examples/pg_parsing/save_to_excel_01.py", line 39, in save_to_excel
    imported_data = ast.literal_eval(imported_data)
  File "/usr/lib/python2.7/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib/python2.7/ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 0

    ^
SyntaxError: unexpected EOF while parsing

我检查了所有的东西,还在网上搜索了两天试图找出解决办法,但没有找到。

这是模块的链接:

data_parser.py ---> http://codepad.org/nPH3LEay

save_to_excel.py ---> http://codepad.org/9kQ0IzKs

我还附上了data_parser.py生成的字典的一个示例 ---> the_same_domain_as_above/XYPWMcgB

我发现,当ast.literal_eval()开始解析字典时,出现了意外的EOF(文件结束)错误。

但是为什么呢?字典看起来没问题。而且当我手动执行save_to_excel.py时,它运行得很好!

抱歉模块里有这么多内容。我几周前才开始学习python,现在还在犯很多错误 -.-

如果有人能帮我,我会非常开心!谢谢你们的时间!

附言:我在这里添加了一段代码,我不太确定这段代码是否导致了问题:

imported_file = open('pg_database/' + where + '/converted/' + file)
imported_data = imported_file.read()
imported_data = ast.literal_eval(imported_data)

1 个回答

2

好吧,经过一周的时间,并且在做另一个项目时,我意外地找到了问题所在。Sir Cox在上面的评论中问我关于编辑字典/元组的事。但现在我明白我当时没有理解他的意思。

data = open('name.txt')
data = data.read()
converted_data = ast.literal_eval(data)

如果你之前在同一段代码中编辑了你的name.txt文件,但没有关闭它,这样就会导致EOL错误。假设你有一个元组,并且你把它存储在文件里:

saver = open('name.txt', 'w')
saver.write(str(our_tuple))
saver.close()   # you HAVE TO close it before opening it and calling ast.literal_eval on it's data. Otherwise you will get a EOL error.

撰写回答