Продолжайте иметь эту ошибку: JSONDecodeError: Ожидаемое значение: строка 2, столбец 1 (символ 1)

JSON-файл [https://drive.google.com/file/d/1Jb3OdoffyA71vYfojxLedZNPDLq9bn7b/view?usp=sharing]

Я пытаюсь прочитать файл JSON в Python, файл JSON такой же, как ссылка выше. Код, который я написал, выглядит следующим образом:

lst = []
for line in open(json_path,'r'):
    lst.append(json.loads(line))

Но по какой-то причине у меня продолжала появляться эта ошибка JSONDecodeError: Expecting value: line 2 column 1 (char 1) Мне интересно, я сделал что-то не так с кодом или в файле JSON есть ошибка?

Вы не можете загружать файл json построчно. Вы должны вызывать json.loads() для всего содержимого файла.

John Gordon 16.03.2022 22:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлять

Вы можете удалить линию разрыва (\n) перед использованием функции json.loads (спасибо @DeepSpace за комментарий):

import json
lst = []
for line in open("sample.json",'r'):
  stripped = line.strip("\n")
  if stripped != "":
    lst.append(json.loads(stripped))
lst

Также вы можете использовать модуль ast:

import ast
lst = []
for line in open("sample.json",'r'):
  if line.strip("\n") != "":
    lst.append(ast.literal_eval(line))

Объяснение

ast.literal_eval изменяет словарь или список в форме строки (например, "[1,2,3]") на пригодный для использования словарь или список в Python (например, [1,2,3]).

Вывод обоих кодов выше будет:

[{'content': [{'c_id': '002',
    'p_id': 'P02',
    'source': 'internet',
    'type': 'org'},
   {'c_id': '003', 'p_id': 'P03', 'source': 'internet', 'type': 'org'},
   {'c_id': '005', 'p_id': 'K01', 'source': 'news', 'type': 'people'}],
  'doc_id': '7098727',
  'id': 'lni001',
  'pub_date': '20220301',
  'unique_id': '64WP-UI-POLI'},
 {'content': [{'c_id': '002',
    'p_id': 'P02',
    'source': 'internet',
    'type': 'org'},
   {'c_id': '003', 'p_id': 'P03', 'source': 'internet', 'type': 'org'},
   {'c_id': '005', 'p_id': 'K01', 'source': 'news', 'type': 'people'}],
  'doc_id': '7098727',
  'id': 'lni001',
  'pub_date': '20220301',
  'unique_id': '64WP-UI-POLI'},
 {'content': [{'c_id': '002',
    'p_id': 'P02',
    'source': 'internet',
    'type': 'org'},
   {'c_id': '003', 'p_id': 'P03', 'source': 'internet', 'type': 'org'},
   {'c_id': '005', 'p_id': 'K01', 'source': 'news', 'type': 'people'}],
  'doc_id': '7098727',
  'id': 'lni001',
  'pub_date': '20220301',
  'unique_id': '64WP-UI-POLI'},
 {'content': [{'c_id': '012',
    'p_id': 'K21',
    'source': 'internet',
    'type': 'location'},
   {'c_id': '034', 'p_id': 'P17', 'source': 'news', 'type': 'people'},
   {'c_id': '098', 'p_id': 'K54', 'source': 'news', 'type': 'people'}],
  'doc_id': '7097889',
  'id': 'lni002',
  'pub_date': '20220301',
  'unique_id': '64WP-UI-CFGT'},
 {'content': [{'c_id': '012',
    'p_id': 'K21',
    'source': 'internet',
    'type': 'location'},
   {'c_id': '034', 'p_id': 'P17', 'source': 'news', 'type': 'people'},
   {'c_id': '098', 'p_id': 'K54', 'source': 'news', 'type': 'people'}],
  'doc_id': '7097889',
  'id': 'lni002',
  'pub_date': '20220301',
  'unique_id': '64WP-UI-CFGT'}]

Большое спасибо, но мне любопытно, как вы можете сказать/проверить, что каждая строка json является диктовкой?

CodingStark 16.03.2022 22:40

@CodingStark Рад помочь. Потому что они в форме словаря. Словари начинаются с { и заканчиваются на }. Конечно, было бы гораздо больше элементов, определяющих словарь.

Amirhossein Kiani 16.03.2022 22:42

Понятно! Большое спасибо. Кроме того, я попробовал подход line.strip("\n"), но он выдал мне ошибку JSONDecodeError: Expecting value: line 1 column 1 (char 0)

CodingStark 16.03.2022 22:44

@CodingStark О, это немного странно! Потому что я скачал файл sample.json и попробовал оба упомянутых скрипта, и все они работают нормально! Не уверен, почему вы получаете эту ошибку.

Amirhossein Kiani 16.03.2022 22:47

@CodingStark О, в вашем примере файла JSON есть несколько строк разрыва без каких-либо других символов. Я отредактировал ответ в соответствии с вашим комментарием, надеюсь, теперь он соответствует вашему вопросу.

Amirhossein Kiani 16.03.2022 22:50

Оно работает! Большое спасибо за помощь!

CodingStark 18.03.2022 06:45

Другие вопросы по теме