SyntaxError: неожиданный EOF при разборе в ast.py при преобразовании текста в список кортежей - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть .txt файл с именем my_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

Я не уверен, почему в большинстве случаев все работает, но в случае этого конкретного файла нет.Любая помощь приветствуется!

1 Ответ

1 голос
/ 22 апреля 2019

Проблема здесь в том, что когда вы разделяете на новую строку через \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
...