【问题标题】:Python json.py can't convert string to dictionaryPython json.py 无法将字符串转换为字典
【发布时间】:2021-10-22 01:47:48
【问题描述】:

我正在尝试将字典放入 .txt 文件,然后使用 json.load(File.read()) 将字符串解析为字典。

由于某种原因,它无法正常工作。

代码:

import json
File = open(r"{}.txt".format(path), 'w')
File.write(json.dumps({"Key":"Value"}))
File.close()
#There the .txt file is {'Key':'Value'}
File = open(r"{}.txt".format(path), 'r')
Dictionary = json.loads(File.read())

错误:

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    json.loads(FIle.read())
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

但是当我这样做时:

>>> json.dumps({"Key":"Value"})
'{"Key": "Value"}'
>>> json.loads('{"Key": "Value"}')
{'Key': 'Value'}
>>>

没有出错。

为什么会这样?提前感谢您的回答。

编辑


非常感谢 cmets 中的谁建议我使用 json.load(),它奏效了。

>>> json.load(open(r"C:\\Users\FLAK-ZOSO\Desktop\mlmlm.txt", 'r+'))
{'Key': 'Value'}
>>> Dictionary = json.load(open(r"C:\\Users\WouldYouLikeToKnow\Desktop\mlmlm.txt", 'r+'))
>>> Dictionary
{'Key': 'Value'}

问题是文件结果为空,因为在 File.close() 之前没有保存编辑。
谢谢大家帮助我。

【问题讨论】:

  • .read 方法可能会添加一个额外的 '\n' 字符来指示换行。你可能想用.strip("\n") 去掉它
  • 还有另一种接受文件的方法 (json.load())。你可以做json.load(File)。写入文件也有类似的方法:json.dump(File, data)
  • 该代码不会产生该错误。
  • 回溯显示FIle.read(),而不是File.read() - 你确定你是从你认为你是的文件中读取,而不是之前打开的恰好是空的文件吗?
  • @Sujay read 不会那样做。即使有,为什么不干脆让loads 忽略它呢?

标签: python json python-3.x dictionary


【解决方案1】:

json 库的方法不止json.dumps() 和json.loads()。


  • json.dumps 代表dump-s 其中s 代表string
  • json.loads 代表load-s 其中s 代表string

实际上这两个方法是返回或作为参数传递string-type。

>>> json.dumps({1: 'a', 2: 'b'}) #Needs as parameter an object or a value
'{"1": "a", "2": "b"}' #Returns a string
>>> json.loads('{"1": "a", "2": "b"}') #Needs as parameter a string
{'1': 'a', '2': 'b'} #Parses an object or returns a value

  • json.dump 写入指定为第二个参数(.txt 或 .json)的文件,第一个参数传递
  • json.load 读取作为第一个参数传递的文件(.txt 或 .json)

这两种方法是读取或写入.json 文件。

>>> json.dumps({1: 'a'}, open('file.json', 'w+'))
>>> json.load(open('file.json', 'r'))
{'1': 'a'} #Returns an object or a value

因此,为了避免引发错误,您可以避免这样做:

value = json.loads(open('file.json', 'r').read()) #Shouldn't do this
value = json.load(open('file.json', 'r')) #Much better, more efficient and it doesn't raise any error

【讨论】:

    【解决方案2】:

    由于我没有评论的声誉,所以我写这个作为答案。我试图在我的机器上运行你的错误代码并且它没有任何问题(假设我用类似'check_json.json'的东西替换路径)。这告诉我它与您的环境有关。

    当您对空字符串(即 File. read() 正在返回一个空字符串,json.loads 不知道如何处理。

    一些可能的问题可能是:

    1. 您在某处重新定义了保留关键字,因此 Python 正在努力让对象按应有的方式运行(根据您对文件和字典的使用,在黑暗中开枪。是的,它们不是内置/保留字,而是谁知道剩下的代码是什么样子的?)
    2. 您的 Python 安装有问题,您需要重新安装它。
    3. 您拥有某种奇怪的权限,阻止您将数据实际保存到您正在创建的文件中。

    【讨论】:

    • 它每次都与我的环境有关您将能够通过评论回答?。我会接受它,因为其中一个问题是我使用的方法,但另一个问题是 File.read() 返回一个空字符串,正如您所猜测的那样。干得好。
    猜你喜欢
    • 2018-05-19
    • 2013-03-13
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2013-02-03
    • 2011-06-10
    相关资源
    最近更新 更多