我有一个很大的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在文件中用换行符替换$符号的建议吗?
答案 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}}