json - 使用python读取块大小的JSON文件时出错
问题描述
我有一个大的 json 文件,所以我想在测试时分块读取文件。我已经实现了以下代码:
if fpath.endswith('.json'):
with open(fpath, 'r') as f:
read_query = pd.read_json(f, lines=True, chunksize=100)
for chunk in read_query:
print(chunk)
我得到错误:
File "nameoffile.py", line 168, in read_queries_func
for chunk in read_query:
File "C:\Users\Me\Python38\lib\site-packages\pandas\io\json\_json.py", line 798, in __next__
obj = self._get_object_parser(lines_json)
File "C:\Users\Me\Python38\lib\site-packages\pandas\io\json\_json.py", line 770, in _get_object_parser
obj = FrameParser(json, **kwargs).parse()
File "C:\Users\Me\Python38\lib\site-packages\pandas\io\json\_json.py", line 885, in parse
self._parse_no_numpy()
File "C:\Users\Me\Python38\lib\site-packages\pandas\io\json\_json.py", line 1159, in _parse_no_numpy
loads(json, precise_float=self.precise_float), dtype=None
ValueError: Expected object or value
为什么我会收到错误消息?
JSON 文件如下所示:
[
{
"a": "13",
"b": "55"
},
{
"a": "15",
"b": "16"
},
{
"a": "18",
"b": "45"
},
{
"a": "1650",
"b": "26"
},
.
.
.
{
"a": "214",
"b": "23"
}
]
另外,有没有办法在读取文件时只提取“a”属性的值?还是只能在我阅读文件后才能完成?
解决方案
您的 json 文件只包含一个对象。根据参数的文档所指向的行分隔的 json 文档:chunksize
pandas 能够读取和写入行分隔的 json 文件,这些文件在使用 Hadoop 或 Spark 的数据处理管道中很常见。
对于以行分隔的 json 文件,pandas 还可以返回一个迭代器,它一次读取块大小的行。这对于大文件或从流中读取很有用。
它还暗示lines=True
, 和行的文档说:
将文件作为每行的 json 对象读取。
这意味着像这样的文件可以工作:
{"a": 1, "b": 2}
{"a": 3, "b": 4}
{"a": 5, "b": 6}
{"a": 7, "b": 8}
{"a": 9, "b": 10}
这些不会:
[
{"a": 1, "b": 2},
{"a": 3, "b": 4},
{"a": 5, "b": 6},
{"a": 7, "b": 8},
{"a": 9, "b": 10}
]
因此,您必须一口气读取文件,或者在进行时对其进行修改以使每行有一个对象。
推荐阅读
- excel - Excel VBA 用于在不使用范围的情况下制作多个图形
- php - php mysql准备好的语句不更新空值
- node.js - 在路由器基础设置上遇到错误 TypeError('Router.use() 需要一个中间件函数但得到一个 ' + gettype(fn))
- c++ - 'std::thread' 如何确定传递给构造函数的可变参数的数量
- line-breaks - 天蓝色数据流的表达式生成器中是否有换行符?
- palantir-foundry - 如何使用数据连接来同步只有模式而没有行的数据集?
- kubernetes - 如何在操作员框架中使用leader-with-lease选举pod成为leader后执行功能?
- reactjs - 如何使用状态从对象调用方法
- python - Django:通过PayPal成功付款后如何将用户重定向到订单完成页面
- oauth-2.0 - 我有一个我创建的 Google Drive 应用程序,我应该对应用程序的用户隐藏客户端密码吗?