最常用的逻辑方式(在Python中)编辑磁盘上的JSON文件

时间:2015-03-16 04:27:03

标签: python json

读取JSON文件(每个JSON对象由\ n分隔)并更改其中一个值的最合理方式是什么?

让我们假设我有500万个JSON对象,其中一个字段是" apple"但需要是" orange"代替。请记住,我已经修复了生成此数据的源代码(因此这种情况永远不会再发生)但是这项工作大约需要2周时间才能运行,所以我只是修补它而不是再次运行作业并等待2周。

我是一名新手程序员,但我认为最好的方法是:

  1. 一次读取一行原始文件
  2. 对于文件中的每一行:
  3. 通过json.loads(line)将数据加载到名为json_data
  4. 的变量中
  5. 在json_data中将apple更改为橙色
  6. 将json_data写入新文件
  7. 写一个换行符
  8. 重复直到达到Apple文件的结尾
  9. 有一种简单的方法可以做到这一点,还是我最好使用2个文件?

    非常感谢

3 个答案:

答案 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)