Python ValueError使用pd.read_json读取大数据集
我正在制作一套使用a。在练习的这一点上,我应该阅读review.json,它每行有一条json记录。我制作了一个JSON文件的较小版本,只有100条记录,用于测试 我可以将整个测试文件读入pandas数据框并检查它 然而,完整的数据集文件大约有600万行。建议使用chunksize并构建json读取器。即使使用测试输入,我也会出错 我的代码目前看起来像这样Python ValueError使用pd.read_json读取大数据集,python,json,pandas,valueerror,Python,Json,Pandas,Valueerror,我正在制作一套使用a。在练习的这一点上,我应该阅读review.json,它每行有一条json记录。我制作了一个JSON文件的较小版本,只有100条记录,用于测试 我可以将整个测试文件读入pandas数据框并检查它 然而,完整的数据集文件大约有600万行。建议使用chunksize并构建json读取器。即使使用测试输入,我也会出错 我的代码目前看起来像这样 path = 'file://localhost/Users/.../DSC_Intro/' filename = path + 'yelp
path = 'file://localhost/Users/.../DSC_Intro/'
filename = path + 'yelp_dataset/review_100.json'
# create a reader to read in chunks
review_reader =
pd.read_json(StringIO(filename), lines=True, chunksize=10)
type(review_reader)
类型调用返回
pandas.io.json.json.JsonReader
看起来不错
然后我试着
for chunk in review_reader:
print(chunk)
如中所述
我得到一个错误:
ValueError: Unexpected character found when decoding 'false'
更新-有人认为该问题是由数据文件中嵌入的(带引号的)“\n”字符引起的;熊猫看到的JSON记录不是每行一条,而是多行
如果是这样的话,错误消息是非常不透明的。另外,对于600万行,我应该如何告诉pd.read\u json忽略“\n”
,而只查看数据中的实际换行
更新
有人建议,如果我修复我的输入错误(这是本文中的输入错误,而不是代码中的输入错误),并使用Unix文件路径而不是URL(JSON不关心:请参阅文档)
当我这样做但保留StringIO()时,我会得到一个不同的ValueError
当我执行此操作但删除StringIO()时,代码会正常工作
这似乎很脆弱-(
注意本教程有一个答案键。我已经尝试过该代码。答案键使用
review_reader =
pd.read_json(filename, lines=True, chunksize=10)
这会引发打字错误
sequence item 0: expected str instance, bytes found
添加StringIO()
似乎解决了这个问题
Input示例JSON记录,输入文件的每行一条
{review_id:“Amo5gZBvCuPc_tZNpHwtsA”,“user_id:“DzZ7piLBF WsJxqosfJgtA”,“business_id:“qx6WhZ42eDKmBchZDax4dQ”,“stars:”5.0,“有用的”:1,“有趣的”:0,“酷的”:0,“文本:“我们家喜欢这里的食物。快捷、友好、美味,是一家带孩子去的好餐馆。5星级!”,“日期”:“2017-03-27 01:14:37”<
path 'file://localhost/Users/.../DSC_Intro/'
不是有效的python代码。如果您尝试这样执行,您将得到一个无效的语法错误。那么,我假设这只是显示path变量的值。我不知道这些省略号是文字还是您的环境截断了path
显示的结果。我在这里假设您的路径是有效的fiLLE URL为您的系统,因为它似乎不符合这里考虑一个不正确的路径。< /P>
无论哪种方式,是的,read_json
都可以从文件URL中读取json,因为您在那里指定了它(我在那里学到了一些东西),如果您一次性读取:
pd.read_json(fname, lines=True)
但是,如果您试图通过指定
pd.read_json(fname, lines=True, chunksize=...)
然后你得到
TypeError: sequence item 0: expected str instance, bytes found
第二,是的,用StringIO包装类似文件的参数可以消除这个错误,但无论出于什么原因,它都没有帮助,它的使用是基于对您所指的pandas文档的误读
我将在这里引用read_json
文档中的几位:
签名:pd.read_json(
路径_或_buf=无
path_或_buf:有效的JSON字符串或类似文件,默认值:无
字符串可以是URL。有效的URL方案包括http、ftp、s3、,
gcs和文件。对于文件URL,需要一个主机。例如,本地
文件可能是file://localhost/path/to/table.json
因此,对于read_json,您可以给它一个实际的字符串,该字符串是有效的json,也可以给它一个类似文件的对象,该对象指向包含json的文件
请注意,在您引用的熊猫文档中:
In [258]: jsonl = '''
.....: {"a": 1, "b": 2}
.....: {"a": 3, "b": 4}
.....: '''
.....:
是JSON,而不是路径。当他们的示例执行以下操作时:
df = pd.read_json(jsonl, lines=True)
它只是解析字符串中的JSON,这里不涉及任何文件。
然后,当它想要演示如何以块的形式从文件中读取数据时,它会这样做
# reader is an iterator that returns `chunksize` lines each iteration
In [262]: reader = pd.read_json(StringIO(jsonl), lines=True, chunksize=1)
换句话说,他们是通过StringIO()包装一个JSON字符串,而不是一个路径。这只是出于文档示例的目的,因此您可以看到,如果您将JSON字符串视为从文件读取,则可以将其分块读取。StringIO()就是这样做的。因此,当您在StringIO()中包装描述文件URL的字符串时,我希望read_json
会尝试将该字符串解释为从文件中读取的json并对其进行解析。这是可以理解的,因为它不是json
这让我们回到了为什么read_json
不能分块读取您的文件URL。对此,我没有一个很好的答案。我怀疑这是read_json
如何打开文件URL的内部原因,或者这背后有什么功能。如果您有意或被迫从文件URL进行分块,那么我怀疑您可能会我想控制文件打开的模式,或者以某种方式为read_json
如何解释它得到的ByTestStream提供明确的指导。我不确定像urllib2
这样的库在这里可能有用
但是,让我们转到最佳解决方案。为什么我们要尝试将路径指定为文件URL?只需将您的路径指定为操作系统路径,例如
path = '/path/to/my/data/'
然后
filename = path + 'yelp_dataset/review_100.json'
# create a reader to read in chunks
review_reader = pd.read_json(filename, lines=True, chunksize=10)
我敢打赌,它是按计划工作的!(它对我来说是这样的,就像它一直以来一样)。
警告:windows不使用正斜杠路径分隔符,以上述方式连接字符串来构造路径可能很脆弱,但通常如果使用“正确的”正斜杠分隔符(微笑),体面的语言内部理解这一点。它使用反斜杠构建路径,这肯定会给您带来痛苦。但请注意这一点。首先,您的
path 'file://localhost/Users/.../DSC_Intro/'
不是有效的python代码。如果您尝试这样执行,您将得到一个无效的语法错误。那么,我假设这只是显示path变量的值。我不知道这些省略号是文字还是您的环境截断了path
显示的结果。我在这里假设您的路径是