Python 为什么JSONDecodeError对应于此特定函数的运行次数?

Python 为什么JSONDecodeError对应于此特定函数的运行次数?,python,json,python-3.x,Python,Json,Python 3.x,提前:我为这个模糊的问题和冗长的描述道歉。我无法用我的生命来指出这个问题,我现在绝望了 这是一个在命令行上运行的小程序。它允许用户添加或更新条目。这些条目是一个字典的键值对——它最初是一个文本文件,与名为info.txt的脚本处于同一级别,它必须用“{}”进行实例化(我知道这是一个糟糕的程序,稍后我会解决问题)。总之,它读取一个文本文件,将其转换为JSON对象进行操作,然后写回文本文件 剧本: import os import json import sys def addNew():

提前:我为这个模糊的问题和冗长的描述道歉。我无法用我的生命来指出这个问题,我现在绝望了

这是一个在命令行上运行的小程序。它允许用户添加或更新条目。这些条目是一个字典的键值对——它最初是一个文本文件,与名为
info.txt
的脚本处于同一级别,它必须用“{}”进行实例化(我知道这是一个糟糕的程序,稍后我会解决问题)。总之,它读取一个文本文件,将其转换为JSON对象进行操作,然后写回文本文件

剧本:

import os
import json
import sys


def addNew():

    with open(os.path.join(os.path.abspath(os.path.dirname(__file__)),
              "info.txt")) as entryFile:
        entryDict = json.load(entryFile)

    newEntry = sys.argv[1]
    newValue = sys.argv[2]
    confirmNew = input("Add \"{0}\" with \"{1}\" to the dictionary?"
                       "\ny or n\n".format(newEntry, newValue))

    if confirmNew == "y":
        entryDict[newEntry] = newValue
        print("You have added {} to your dictionary".format(newEntry))
    else:
        print("You have not added a new entry")

    entryString = json.dumps(entryDict)

    with open(os.path.join(os.path.abspath(os.path.dirname(__file__)),
              "info.txt"), "r+") as entryFile:
        entryFile.write(entryString)


def update():
    print("An entry with this name already exists.")

    entryFile = open(os.path.join(os.path.abspath(os.path.dirname(__file__)),                     
        "info.txt"), "r+")

    entryDict = json.load(entryFile)
    confirmUpdate = input("Update '{0}' with '{1}'?\n"
                          .format(sys.argv[1], sys.argv[2]))
    if confirmUpdate == "y":
        entryDict.update({str(sys.argv[1]): sys.argv[2]})

    entryString = json.dumps(entryDict)
    entryFile.truncate(0)
    entryFile.write(entryString)
    entryFile.close()
    print("{} has been updated.".format(sys.argv[1]))


def main():

    entryFile = open(os.path.join(os.path.abspath(os.path.dirname(__file__)),         
    "info.txt"))
    entryDict = json.load(entryFile)
    entryFile.close()

    if len(sys.argv) < 2:
        print('usage: python3 {} entry value - entry manager '
              '\nentry: name of entry and its value to add to the dict.'
              .format(sys.argv[0]))
        sys.exit()

    if len(sys.argv) == 3 and not sys.argv[1] in entryDict:
        addNew()
        sys.exit()

    if len(sys.argv) == 3 and sys.argv[1] in entryDict:
        update()
        sys.exit()


if __name__ == "__main__":
    main()
导入操作系统
导入json
导入系统
def addNew():
使用open(os.path.join(os.path.abspath(os.path.dirname(_文件__)),
“info.txt”))作为入口文件:
entryDict=json.load(entryFile)
newEntry=sys.argv[1]
newValue=sys.argv[2]
confirmNew=input(“将\“{0}\”和\“{1}\”添加到字典中?”
“\ny或n\n”。格式(newEntry,newValue))
如果confirmNew==“y”:
entryDict[newEntry]=newValue
打印(“您已将{}添加到词典中”。格式(新条目))
其他:
打印(“您尚未添加新条目”)
entryString=json.dumps(entryDict)
使用open(os.path.join(os.path.abspath(os.path.dirname(_文件__)),
“info.txt”),“r+”)作为入口文件:
write(entryString)
def update():
打印(“具有此名称的条目已存在。”)
entryFile=open(os.path.join(os.path.abspath(os.path.dirname(_文件__)),
“info.txt”),“r+”)
entryDict=json.load(entryFile)
confirmUpdate=input(“用“{1}”更新“{0}”?\n”
.format(sys.argv[1],sys.argv[2]))
如果confirmUpdate==“y”:
entryDict.update({str(sys.argv[1]):sys.argv[2]})
entryString=json.dumps(entryDict)
entryFile.truncate(0)
write(entryString)
entryFile.close()
打印(“{}已更新。”.format(sys.argv[1]))
def main():
entryFile=open(os.path.join(os.path.abspath(os.path.dirname(_文件__)),
“info.txt”))
entryDict=json.load(entryFile)
entryFile.close()
如果len(系统argv)<2:
打印('用法:python3{}条目值-条目管理器'
“\n条目:要添加到目录中的条目名称及其值”
.format(sys.argv[0]))
sys.exit()
如果len(sys.argv)==3,而不是entryDict中的sys.argv[1]:
addNew()
sys.exit()
如果len(sys.argv)==3且entryDict中的sys.argv[1]:
更新()
sys.exit()
如果名称=“\uuuuu main\uuuuuuuu”:
main()
它按预期工作,直到我两次调用
update()
函数。换句话说,只有当我在此处执行两次
python3 file.py entryName值时,它才会出现JSONDECODE错误。两次,因为根据程序,如果info.txt字典中已经存在一个entryName,那么它应该更新该条目。
为什么
update()
只工作一次,而不是两次?
错误:
raise JSONDecodeError(“预期值”,s,err.value)从None开始
json.decoder.JSONDecodeError:期望值:第1行第1列(字符0)
指向主函数中的
entryDict=json.load(entryFile)

我尝试了不同的
load/load
“r/w/a+”
。似乎什么都不管用。我(主要)做错了什么


编辑:如果您对常规脚本编写/编程有任何提示,我们将不胜感激。

问题是,在调用
file.truncate(0)
后,您不会将新内容写入文件的开头。发件人:

截断(大小=无)

将流大小调整为给定的字节大小(如果未指定大小,则调整为当前位置)当前流位置不正确 已更改。此调整大小可以扩展或减小当前文件大小。在里面 对于扩展名,新文件区域的内容取决于 平台(在大多数系统上,附加字节为零填充)。新的 返回文件大小

因此,在读取、截断和写入文件后,文件的内容看起来会像这样(其中
\x00
表示空字节):


要解决此问题,请在
entryFile.truncate(0)
之后添加
entryFile.seek(0)
,问题是,在调用
file.truncate(0)
之后,您不会将新内容写入文件的开头。发件人:

截断(大小=无)

将流大小调整为给定的字节大小(如果未指定大小,则调整为当前位置)当前流位置不正确 已更改。此调整大小可以扩展或减小当前文件大小。在里面 对于扩展名,新文件区域的内容取决于 平台(在大多数系统上,附加字节为零填充)。新的 返回文件大小

因此,在读取、截断和写入文件后,文件的内容看起来会像这样(其中
\x00
表示空字节):


要解决此问题,请在
entryFile.truncate(0)
之后添加
entryFile.seek(0)
>>open(“info.txt”).read()'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{“k”:“v2}'
@thaavik?我该如何阻止它呢?在写入过程中,会在文件中附加一些额外的字符:
>>>open(“info.txt”).read()'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{“k”:“v2”}'
@thaavik这是从哪里来的?我该怎么阻止它?是的,这是正确的方法。请参阅这里的第一个答案,以获得更清晰的方式打开文件进行读写:是的,这是正确的方法。请参阅此处的第一个答案,以获得更清晰的方式打开文件进行读写:
\x00\x00\x00\x00\x00\x00\x00\x00{"key": "value"}