SyntaxError:在将文本转换为元组列表时在ast.py中解析时出现意外的EOF

问题描述 投票:0回答:1

我有一个名为.txtmy_file文件,其中包含以下字符串:

[(11.0795, 16), (12.0354, 16)]
[(11.0795, 19), (12.0354, 19)]
[(11.0795, 16), (12.0354, 16)]

现在,我使用以下代码将行转换为元组列表:

import ast


file_name = open('/home/username/Desktop/my_file.txt', "r")
lines = file_name.read().split('\n')
xy = ast.literal_eval(str(lines[0].split('"')).strip("[]").strip("'"))
xz = ast.literal_eval(str(lines[1].split('"')).strip("[]").strip("'"))
yz = ast.literal_eval(str(lines[2].split('"')).strip("[]").strip("'"))
print(xy[0])
print(yz[1])
print(xz[0][0])

但是,我收到以下错误:

File "/home/username/anaconda3/lib/python3.6/ast.py", line 48, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/home/username/anaconda3/lib/python3.6/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 0

    ^
SyntaxError: unexpected EOF while parsing

我不确定为什么在大多数情况下一切正常,但在这个特定文件的情况下没有。任何帮助表示赞赏!

python python-3.x parsing syntax-error eof
1个回答
1
投票

这里的问题是当你通过\n拆分换行符时,你的输出中也会出现空行,当你尝试在它们上运行ast.literal_eval时,它们会抛出异常。

让我们运行您的原始代码,在这里我将内容存储在字符串而不是文件中。

s = """
[(11.0795, 16), (12.0354, 16)]
[(11.0795, 19), (12.0354, 19)]
[(11.0795, 16), (12.0354, 16)]
"""

import ast

lines = s.split('\n')
xy = ast.literal_eval(str(lines[0].split('"')).strip("[]").strip("'"))
xz = ast.literal_eval(str(lines[1].split('"')).strip("[]").strip("'"))
yz = ast.literal_eval(str(lines[2].split('"')).strip("[]").strip("'"))
print(xy[0])
print(yz[1])
print(xz[0][0])

现在我确实得到了你得到的错误。

Traceback (most recent call last):
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1741, in <module>
    main()
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1735, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1135, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/Users/deveshks/PycharmProjects/DevProjects/script.py", line 11, in <module>
    xy = ast.literal_eval(str(lines[0].split('"')).strip("[]").strip("'"))
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py", line 46, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 0

    ^
SyntaxError: unexpected EOF while parsing

现在,如果我修改我分割文本的行以忽略空行,则代码运行完美。

s = """
[(11.0795, 16), (12.0354, 16)]
[(11.0795, 19), (12.0354, 19)]
[(11.0795, 16), (12.0354, 16)]
"""

import ast


lines = [line.strip() for line in s.split('\n') if line.strip() != '']
xy = ast.literal_eval(str(lines[0].split('"')).strip("[]").strip("'"))
xz = ast.literal_eval(str(lines[1].split('"')).strip("[]").strip("'"))
yz = ast.literal_eval(str(lines[2].split('"')).strip("[]").strip("'"))
print(xy[0])
print(yz[1])
print(xz[0][0])

我现在得到输出

(11.0795, 16)
(12.0354, 16)
11.0795
© www.soinside.com 2019 - 2024. All rights reserved.