当前位置: 首页 > 面试题库 >

在Python中打开没有换行符的大型JSON文件以进行csv转换Python 2.6.6

方昊阳
2023-03-14
问题内容

我正在尝试将非常大的json文件转换为csv。我已经能够将这种类型的小文件转换为10条记录(例如)csv文件。但是,当尝试转换大文件(csv文件中的50000行的数量)时,它不起作用。数据是通过curl命令创建的,其中-
o指向要创建的json文件。输出的文件中没有换行符。csv文件将使用csv.DictWriter()编写,并且(其中数据是json文件输入)的格式

rowcount = len(data['MainKey'])
colcount = len(data['MainKey'][0]['Fields'])

然后,我遍历行和列的范围以获取csv词典条目

csvkey = data['MainKey'][recno]['Fields'][colno]['name']
cvsval = data['MainKey'][recno][['Fields'][colno]['Values']['value']

我尝试使用其他问题的答案,但它们不适用于大文件(du -m bigfile.json = 157),而我要处理的文件更大。

尝试获取每行的大小将显示

myfile = open('file.json','r').
line = readline():
print len(line)

显示这将读取整个文件为完整字符串。因此,一个小文件将显示67744的长度,而大文件将显示163815116。

尝试直接从中读取数据

data=json.load(infile)

给出其他问题针对大文件讨论的错误

尝试使用

def json_parse(self, fileobj, decoder=JSONDecoder(), buffersize=2048):


  yield results

如另一个答案所示,该文件适用于72 kb的文件(10行22列),但似乎对于中等大小的157
mb文件来说是锁定的或占用无数时间(来自du -m bigfile.json)

请注意,调试打印显示默认输入参数指定的每个块的大小为2048。似乎它试图遍历2048个块中的整个163815116(如上面的len所示)。如果将块大小更改为32768,则简单的数学计算表明,循环需要5,000个周期来处理文件。

更改为524288的块大小后,大约每11个块都会退出循环,但仍应占用大约312个块来处理整个文件

如果我可以将其停在每个行项目的末尾,则可以处理该行并将其发送到基于以下所示形式的csv文件。

小文件上的vi显示它的形式

{"MainKey":[{"Fields":[{"Value": {'value':val}, 'name':'valname'}, {'Value': {'value':val}, 'name':'valname'}}], (other keys)},{'Fields' ... }] (other keys on MainKey level) }

我无法使用ijson,因为我必须为无法导入其他软件的系统进行设置。


问题答案:

为了处理文件,我最后使用了8388608(十六进制0x800000)的块大小。然后,我处理了循环中已读取的行,并保留了已处理行数和已丢弃行数。在每个处理功能中,我将数字添加到总数中,以便可以跟踪已处理的记录总数。

这似乎是它需要走的路。

下次问类似这样的问题时,请强调必须指定较大的块大小,而不是原始答案中所示的2048。

循环去

first = True
for data in self.json_parse(inf):
  records = len(data['MainKey'])
  columns = len(data['MainKey'][0]['Fields'])
  if first:
    # Initialize output as DictWriter
    ofile, outf, fields = self.init_csv(csvname, data, records, columns)
    first = False
  reccount, errcount = self.parse_records(outf, data, fields, records)

在解析例程中

for rec in range(records):
  currec = data['MainKey'][rec]
  # If each column count can be different
  columns = len(currec['Fields'])
  retval, valrec = self.build_csv_row(currec, columns, fields)

要解析列,请使用

for col in columns:
  dataname = currec['Fields'][col]['name']
  dataval = currec['Fields'][col]['Values']['value']

因此,参考现在可以正常工作,并且处理已正确处理。大块显然允许处理足够快以处理数据,同时又足够小而不会使系统过载。



 类似资料:
  • 问题内容: 我想知道是否有一种方法可以打印没有换行符的元素,例如 并且将打印而不是通常打印的内容 谢谢! 问题答案: 这可以用轻松完成打印() 函数 与 Python 3中 。 会给你 在 Python v2中, 您可以通过以下方式使用该函数: 作为源文件中的 第一条 语句。 如print()文档所述: 请注意,这类似于我最近回答的问题(https://stackoverflow.com/a/12

  • 问题内容: 这是我的代码,非常简单的东西… 声明一些字段名称,阅读器使用CSV读取文件,并使用字段名称将文件转储为JSON格式。这是问题所在… CSV文件中的每个记录都在不同的行上。我希望JSON输出采用相同的方式。问题在于,将其全部倾倒在一条长长的巨线上。 我试过使用类似的代码,然后在该代码下面运行我的代码,该代码循环遍历每一行,但它在一行上执行整个文件,然后在另一行上遍历整个文件…一直持续到行

  • 问题内容: 在Python中,调用 产生一个列表,其中每个元素都是文件中的一行。这有点愚蠢,但是仍然:还为每个元素写换行符,这是我不希望发生的事情。 如何避免呢? 问题答案: 您可以使用读取整个文件并分割行: 或者,您可以手动删除换行符: 注意:仅当文件以换行符结尾时,后一种解决方案才有效,否则最后一行将丢失字符。 在大多数情况下,此假设是正确的(尤其是对于文本编辑器创建的文件,这些文件通常确实会

  • 问题内容: 我想用python来做 。我想在中的此示例中做什么: 在C中: 输出: 在Python中: . 在Python中print会添加或空格,如何避免呢?现在,这只是一个例子,不要告诉我可以先构建一个字符串然后再打印它。我想知道如何将字符串”append”到。 问题答案: 在Python 3中,你可以使用函数的和参数: 不在字符串末尾添加换行符: 在要打印的所有函数参数之间不添加空格: 你可

  • 问题内容: 我正在使用Python脚本处理大型CSV文件(数以10M行的GB数)。 这些文件具有不同的行长,并且无法完全加载到内存中进行分析。 每行由脚本中的一个函数分别处理。分析一个文件大约需要20分钟,并且看来磁盘访问速度不是问题,而是处理/函数调用。 代码看起来像这样(非常简单)。实际的代码使用Class结构,但这是相似的: 鉴于计算需要共享的数据结构,使用多核在Python中并行运行分析的

  • 问题内容: 我有一长行代码,我想在多行中分解。我使用什么,语法是什么? 例如,添加一串字符串, 并分成两行,如下所示: 问题答案: 线路是什么?你可以在下一行中使用参数而不出现任何问题: 否则,你可以执行以下操作: 查看样式指南以获取更多信息。 从示例行中: 要么: 请注意,样式指南指出,最好使用带括号的隐式连续符,但是在这种特殊情况下,仅在表达式周围加上括号可能是错误的方法。