Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError使用pd.read_json读取大数据集_Python_Json_Pandas_Valueerror - Fatal编程技术网

Python ValueError使用pd.read_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

我正在制作一套使用a。在练习的这一点上,我应该阅读review.json,它每行有一条json记录。我制作了一个JSON文件的较小版本,只有100条记录,用于测试

我可以将整个测试文件读入pandas数据框并检查它

然而,完整的数据集文件大约有600万行。建议使用chunksize并构建json读取器。即使使用测试输入,我也会出错

我的代码目前看起来像这样

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
显示的结果。我在这里假设您的路径是