用Python替换JSON文件中的字符。大文件(超过1 GB)导致编辑问题

时间:2019-01-31 17:24:45

标签: python json python-3.x

我有一个很大的JSON文件(通过Azure数据工厂导出)。如果DataFactory发现问题,则会在对象之间添加$符号。例如,它看起来像这样:

<br>{...}<br>
{...}<br>
{...}${...}<br>

所以我有一个错误,例如json.decoder.JSONDecodeError: Extra data: line 1 column 21994 (char 21993)

我用一种简单的方法来处理它-用notepad ++将$替换为\ n,这很好;),但是现在我的文件约为1.3 GB,并且我没有工具来编辑这么大的文件。

我使用python从文件中的所有JSON对象导出数据并将其导出为XML。

现在,我正在寻找某种解决方案,以将所有$符号替换为换行符\n并清理文件。

我的代码的开头是:

a = open('test.json', 'r', encoding = 'UTF8')
data1 = a.readlines()
a.close()

for i in range(len(data1)):
    print('Done%d/%d'%(i,len(data1)))
    jsI = json.loads(data1[i])

如果$符号出现文件,则该文件结束。

我可以问一些关于如何使用Python在文件中用换行符替换$符号的建议吗?

2 个答案:

答案 0 :(得分:2)

问题可能出在a.readlines()上,因为它将整个文件带到了您的内存中。处理大型文件时,逐行读取它会变得更加有趣,就像这样:

with open(fname) as f: 
    for line in f:
        # Do your magic here, on this loop
# No need to close it, since the `with` will take care of that.

如果您的目标是将每个$替换为\n,将如下所示:

with open(fname, "r+") as f: 
    for line in f:
        line.replace("$", "\n")

答案 1 :(得分:0)

为了能够处理JSON对象中字符串中可能的$个字符,您可以将输入字符串data1$拆分为多个片段,然后将这些片段一个接一个地连接到字符串中直到可以将其解析为JSON,然后输出该字符串并将其清除以继续下一个片段:

import json
candidate = ''
for fragment in data1.split('$'):
    candidate += fragment
    try:
        json.loads(candidate)
        print(candidate)
        candidate = ''
    except json.decoder.JSONDecodeError:
        candidate += '$'
        continue

例如,给出data1 = '''{}${"a":"$"}${"b":{"c":2}}''',将输出:

{}
{"a":"$"}
{"b":{"c":2}}