TypeError: ожидается объект str, bytes или os.PathLike, а не _io.TextIOWrapper

Я пытаюсь открыть, прочитать, изменить и закрыть файл json, используя пример здесь:

Как добавить ключ-значение к данным JSON, полученным из файла с помощью Python?

import os
import json

path = '/m/shared/Suyash/testdata/BIDS/sub-165/ses-1a/func'
os.chdir(path)

string_filename = "sub-165_ses-1a_task-cue_run-02_bold.json"

with open ("sub-165_ses-1a_task-cue_run-02_bold.json", "r") as jsonFile:
    json_decoded = json.load(jsonFile)

json_decoded["TaskName"] = "CUEEEE"

with open(jsonFile, 'w') as jsonFIle:
    json.dump(json_decoded,jsonFile) ######## error here that open() won't work with _io.TextIOWrapper

В конце я продолжаю получать сообщение об ошибке (с open(jsonFile...), что я не могу использовать переменную jsonFile с open(). Я использовал точный формат в качестве примера, приведенного в ссылке выше, поэтому я не уверен, почему он не работает. В конце концов это переходя к более крупному сценарию, поэтому я хочу держаться подальше от жесткого кодирования/использования строк для имени файла json.


person A T    schedule 07.11.2018    source источник
comment
Когда вы копируете код из Интернета, нет никакой гарантии, что он действительно работает. У вас есть один с открытым, который работает, и один, который не работает. У вас также есть сообщение об ошибке, в котором говорится, почему второй не работает. Это должно дать вам достаточно информации, чтобы решить проблему.   -  person gnasher729    schedule 08.11.2018
comment
Ни вопрос, ни один ответ на самом деле не сработают, потому что цель as не соответствует параметру в вызове json.dump(): jsonFIle против jsonFile (заглавный глаз против нижнего регистра).   -  person Quantum Mechanic    schedule 20.07.2020


Ответы (1)


Этот вопрос немного устарел, но для тех, у кого такая же проблема:

Вы правы, вы не можете открыть переменную jsonFile. Это указатель на другое соединение с файлом, и open хочет строку или что-то подобное. Стоит отметить, что jsonFile также должен быть закрыт после выхода из блока «с», поэтому на него не следует ссылаться за пределами этого.

Однако, чтобы ответить на вопрос:

with open(jsonFile, 'w') as jsonFIle:
   json.dump(json_decoded,jsonFile)

должно быть

with open(string_filename, 'w') as jsonFile:
    json.dump(json_decoded,jsonFile)

Вы можете видеть, что нам просто нужно использовать ту же строку, чтобы открыть новое соединение, а затем мы можем дать ему тот же псевдоним, который мы использовали для чтения файла, если мы хотим. Лично я предпочитаю in_file и out_file просто для того, чтобы четко указать мои намерения.

person General4077    schedule 11.06.2019