读取JSON文件(每个JSON对象由\ n分隔)并更改其中一个值的最合理方式是什么?
让我们假设我有500万个JSON对象,其中一个字段是" apple"但需要是" orange"代替。请记住,我已经修复了生成此数据的源代码(因此这种情况永远不会再发生)但是这项工作大约需要2周时间才能运行,所以我只是修补它而不是再次运行作业并等待2周。
我是一名新手程序员,但我认为最好的方法是:
有一种简单的方法可以做到这一点,还是我最好使用2个文件?
非常感谢
答案 0 :(得分:2)
在Python中,stdlib
模块fileinput
是在优雅的包装器下隐藏这种现实(在某种程度上)的模块。即:
import fileinput
for line in fileinput.input('thefile.name', inplace=True):
line = transform(line)
print line,
(在Python 2中 - 在Python 3中等同于print(line,end='')
)。
你只需要定义逐行转换功能就可以了! E.g,
def transform(line):
return line.replace('"apple"', '"orange"')
将等同于一个答案中提出的sed
解决方案。但是,你可以应用更深层次的逻辑,包括json.loads
,结果结构的转换,再次json.dumps
,如有必要......!
答案 1 :(得分:0)
不完全是Python解决方案,但是在shell中执行此操作会是什么:
sed -i 's/"apple"/"orange"/g' your_file.txt
请注意,这会将整个文件中的所有字段"apple"
更改为"orange"
。但是,添加双引号("
)至少可以确保只替换仅包含apple
的字段,而不仅仅是在另一个随机字段中找到的单词apple
。
当然,您应该在继续之前备份原始文件。
答案 2 :(得分:0)
如果您的文件适合内存,只需加载并编辑即可。它比一次顺序读取,加载和写入一个对象更快。 e.g。
>>> data=open(fpath).read()
>>> data = json.loads(data)
>>> data['xxx']='yyy'
>>> fw=open(fpath,'w')
>>> json.dump(data, fw)