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"}