Я пытаюсь преобразовать файл со строковыми словарями в список словарей. Файл можно найти здесь: https://github.com/szczor/sharing/blob/master/data.txt. Вот как я это делаю:
lista = []
with open(os.path.join(path_to_data, 'data.txt')) as filehandle:
for line in filehandle:
# remove linebreak which is the last character of the string
currentPlace = line[:-1]
# add item to the list
lista.append(currentPlace)
Итак, у меня есть список, теперь с элементами, которые являются строками.
print(type(lista[0]))
Теперь пытаемся преобразовать эти строки в словари с помощью
lista = [json.loads(str(string.replace('\'','\"'))) for string in lista]
Но получить ошибку
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Я попробовал тот же метод с созданным вручную списком, и все сработало, но понятия не имею, почему он не работает с моим текстовым файлом.
я не мог прокомментировать ваш вопрос из-за некоторых привилегий, пытаться
for line in filehandle.readlines(): #instead of just filehandle
Это должно помочь. ast.literal_eval()
должен иметь возможность анализировать строки dict, подобные тем, что находятся в файле данных:
import ast
with open(os.path.join(path_to_data, 'data.txt')) as filehandle:
lista = [
ast.literal_eval(line.strip())
for line
in filehandle
]
Спасибо за ваш ответ, я получаю ValueError: «ValueError: неправильно сформированный узел или строка: объект <_ast.Name по адресу 0x00000210785710A0>»
Вы можете использовать ast.literal_eval
для этого:
import ast
with open(os.path.join(path_to_data, 'data.txt')) as fp:
lines = fp.readlines()
# if there are irregularities, use a try/except to pass these (note, you may wish to use a logger in practice)
output = []
for line in lines:
try:
output.append(ast.literal_eval(line))
except ValueError:
print("malformed string; skipping this line")
except SyntaxError:
print("looks like some encoding errors with this file...")
выход:
[{'Lines': '130',
'Lon': 21.0082356,
'VehicleNumber': '1000',
'Time': '2020-12-23 14:19:31',
'Lat': 52.207217,
'Brigade': '2'},
{'Lines': '213',
'Lon': 21.1013111,
'VehicleNumber': '1001',
'Time': '2020-12-23 15:40:37',
'Lat': 52.2230756,
'Brigade': '2'},
{'Lines': '130',
'Lon': 21.003573,
'VehicleNumber': '1002',
'Time': '2020-12-23 15:40:39',
'Lat': 52.2060591,
'Brigade': '1'},
{'Lines': '311',
'Lon': 21.0807406,
'VehicleNumber': '1003',
'Time': '2020-12-23 15:40:35',
'Lat': 52.2414656,
'Brigade': '2'},
{'Lines': '213',
'Lon': 21.1746171,
'VehicleNumber': '1004',
'Time': '2020-12-23 15:40:24',
'Lat': 52.186474,
'Brigade': '3'},...
Спасибо за ваш ответ, вы использовали его в моем файле? Я получаю сообщение об ошибке: «ValueError: неправильно сформированный узел или строка: объект <_ast.Name по адресу 0x000001E4278689A0>».
привет @wychen. Часть этого. Я могу воспроизвести ошибку, сейчас отладка
в строке 23934 у вас есть какой-то забавный текст. вы можете обернуть попытку, кроме как избежать этого, я обновлю ответ
Спасибо, @anon01, я загружал через API, и в какой-то момент что-то пошло не так, отсюда и этот странный текст, который на польском языке говорит, что что-то пошло не так.
Вот как я бы подошел:
f = open("data.txt", "r")
my_list = []
for x in f: #read the sheet line by line
dict_x = eval(x) #convert each line to dict
my_list.append(dict_x)
f.close()
Кроме того, eval() также можно заменить на dict().
Привет, спасибо за ваш комментарий, но получите ту же ошибку.