- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从 API 下载 Json 文件,我使用以下代码来编写 JSON。循环中的每个项目都会给我一个 JSON 文件。我需要保存它并使用循环从附加的 JSON 文件中提取实体。
for item in style_ls:
dat = get_json(api, item)
specs_dict[item] = dat
with open("specs_append.txt", "a") as myfile:
json.dump(dat, myfile)
myfile.close()
print item
with open ("specs_data.txt", "w") as my file:
json.dump(spec_dict, myfile)
myfile.close()
我知道我无法从 specs_append.txt
获取有效的 JSON 格式,但我可以从 specs_data.txt
获取一个。我正在做第一个,因为我的程序至少需要 3-4 天才能完成,而且我的系统很可能会关闭。那么我可以有效地做到这一点吗?
如果没有,我可以从 specs_append.txt
中提取它<{JSON}{JSON}>
格式(这不是有效的 JSON 格式)?
如果不是,我应该每次在循环中将specs_dict写入txt文件,这样即使程序终止,我也可以从循环中的该点开始,并且仍然获得有效的json格式?
最佳答案
我提出了几种可能的解决方案。
一种解决方案是编写自定义代码来读取输入文件。我建议在文件中的每个 JSON 对象之前放置一个特殊行,例如: ###
然后你可以编写这样的代码:
import json
def json_get_objects(f):
temp = ''
line = next(f) # pull first line
assert line == SPECIAL_LINE
for line in f:
if line != SPECIAL_LINE:
temp += line
else:
# found special marker, temp now contains a complete JSON object
j = json.loads(temp)
yield j
temp = ''
# after loop done, yield up last JSON object
if temp:
j = json.loads(temp)
yield j
with open("specs_data.txt", "r") as f:
for j in json_get_objects(f):
pass # do something with JSON object j
关于此的两个注释。首先,我只是一遍又一遍地附加到一个字符串;这曾经是在 Python 中执行此操作的一种非常慢的方法,因此如果您使用的是非常旧版本的 Python,请不要这样做,除非您的 JSON 对象非常小。其次,我编写了代码来拆分输入并一次生成一个 JSON 对象,但您也可以使用保证唯一的字符串,通过一次调用 f.read()
,然后使用 str.split()
方法函数拆分保证唯一的字符串。
另一个解决方案是将整个文件编写为有效 JSON 对象的有效 JSON 列表。像这样编写文件:
{"mylist":[
# first JSON object, followed by a comma
# second JSON object, followed by a comma
# third JSON object
]}
这需要您的文件附加代码以具有写入权限打开文件,并在写入逗号加换行符之前查找文件中的最后一个 ]
,然后在末尾添加新的 JSON 对象,最后编写 ]}
来关闭文件。如果您这样做,您可以使用 json.loads() 来吸收整个内容并获得 JSON 对象列表。
最后,我建议您也许应该使用数据库。使用 SQLite 或其他东西,然后将 JSON 字符串放入表中。如果你选择这个,我建议使用 ORM 来让你的生活变得简单,而不是手动编写 SQL 命令。
就我个人而言,我赞成第一个建议:编写像 ###
这样的特殊行,然后使用自定义代码来拆分这些标记上的输入,然后获取 JSON 对象。
编辑:好的,第一个建议是假设 JSON 的格式是为了人类可读性,并带有一堆短行:
{
"foo": 0,
"bar": 1,
"baz": 2
}
但它们都是作为一条长线一起运行的:
{"foo":0,"bar":1,"baz":2}
以下是解决此问题的三种方法。
0) 在 ###
之前和之后写入换行符,如下所示:
###
{"foo":0,"bar":1,"baz":2}
###
{"foo":0,"bar":1,"baz":2}
然后每个输入行将交替为 ###
或完整的 JSON 对象。
1) 只要 SPECIAL_LINE
完全唯一(永远不会出现在 JSON 中的字符串内),您就可以执行以下操作:
with open("specs_data.txt", "r") as f:
temp = f.read() # read entire file contents
lst = temp.split(SPECIAL_LINE)
json_objects = [json.loads(x) for x in lst]
for j in json_objects:
pass # do something with JSON object j
.split()
方法函数可以为您将 temp
字符串拆分为 JSON 对象。
2) 如果您确定每个 JSON 对象中永远不会有换行符,您可以简单地将 JSON 对象一个接一个地写入文件,并在每个对象后面添加一个换行符;然后假设每一行都是一个 JSON 对象:
import json
def json_get_objects(f):
for line in f:
if line.strip():
yield json.loads(line)
with open("specs_data.txt", "r") as f:
for j in json_get_objects(f):
pass # do something with JSON object j
我喜欢选项 (2) 的简单性,但我喜欢选项 (0) 的可靠性。如果换行符作为 JSON 对象的一部分写入,选项 (0) 仍然有效,但选项 (2) 会出错。
同样,您也可以简单地使用带有 ORM 的实际数据库 (SQLite),并让数据库关心细节。
祝你好运。
关于python - 在Python中的for循环中编写Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24423751/
我是 PHP 新手。我一直在脚本中使用 for 循环、while 循环、foreach 循环。我想知道 哪个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要
我在高中的编程课上,我的作业是制作一个基本的小计和顶级计算器,但我在一家餐馆工作,所以制作一个只能让你在一种食物中读到。因此,我尝试让它能够接收多种食品并将它们添加到一个价格变量中。抱歉,如果某些代码
这是我正在学习的一本教科书。 var ingredients = ["eggs", "milk", "flour", "sugar", "baking soda", "baking powder",
我正在从字符串中提取数字并将其传递给函数。我想给它加 1,然后返回字符串,同时保留前导零。我可以使用 while 循环来完成此操作,但不能使用 for 循环。 for 循环只是跳过零。 var add
编辑:我已经在程序的输出中进行了编辑。 该程序要求估计给定值 mu。用户给出一个值 mu,同时还提供了四个不等于 1 的不同数字(称为 w、x、y、z)。然后,程序尝试使用 de Jaeger 公式找
我正在编写一个算法,该算法对一个整数数组从末尾到开头执行一个大循环,其中包含一个 if 条件。第一次条件为假时,循环可以终止。 因此,对于 for 循环,如果条件为假,它会继续迭代并进行简单的变量更改
现在我已经习惯了在内存非常有限的情况下进行编程,但我没有答案的一个问题是:哪个内存效率更高;- for(;;) 或 while() ?还是它们可以平等互换?如果有的话,还要对效率问题发表评论! 最佳答
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 8 年前。 我正在尝试创建一个小程序,我可以在其中读取该程序的单词。如果单词有 6
这个问题在这里已经有了答案: python : list index out of range error while iteratively popping elements (12 个答案) 关
我正在尝试向用户请求 4 到 10 之间的整数。如果他们回答超出该范围,它将进入循环。当用户第一次正确输入数字时,它不会中断并继续执行 else 语句。如果用户在 else 语句中正确输入数字,它将正
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我想要做的事情是使用循环创建一个数组,然后在另一个类中调用该数组,这不会做,也可能永远不会做。解决这个问题最好的方法是什么?我已经寻找了所有解决方案,但它们无法编译。感谢您的帮助。 import ja
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我正在模拟一家快餐店三个多小时。这三个小时分为 18 个间隔,每个间隔 600 秒。每个间隔都会输出有关这 600 秒内发生的情况的统计信息。 我原来的结构是这样的: int i; for (i=0;
这个问题已经有答案了: IE8 for...in enumerator (3 个回答) How do I check if an object has a specific property in J
哪个对性能更好?这可能与其他编程语言不一致,所以如果它们不同,或者如果你能用你对特定语言的知识回答我的问题,请解释。 我将使用 c++ 作为示例,但我想知道它在 java、c 或任何其他主流语言中的工
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 C 编程和编写代码的新手,以确定 M 测试用例的质因数分解。如果我一次只扫描一次,该功能本身就可以工作,但是当我尝试执行 M 次时却惨遭失败。 我不知道为什么 scanf() 循环有问题。 in
这个问题已经有答案了: JavaScript by reference vs. by value [duplicate] (4 个回答) 已关闭 3 年前。 我在使用 TSlint 时遇到问题,并且理
我尝试在下面的代码中添加 foreach 或 for 循环,以便为 Charts.js 创建多个数据集。这将允许我在此折线图上创建多条线。 我有一个 PHP 对象,我可以对其进行编码以稍后填充变量,但
我是一名优秀的程序员,十分优秀!