gpt4 book ai didi

python - ValueError 使用 pd.read_json 读取大数据集

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:35 25 4
gpt4 key购买 nike

我正在工作一组 code exercises使用 Yelp reviews dataset 。此时,在练习中,我应该阅读 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)

pandas user guide 中所引用我收到一个错误:

ValueError: Unexpected character found when decoding 'false'

full error output

更新 - 有人认为该问题是由数据文件中嵌入(带引号)“\n”字符引起的; pandas 看到的 JSON 记录不是每行一个,而是多行。

如果是这样的话,错误消息非常不透明。另外,对于 600 万行,我应该如何告诉 pd.read_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() 似乎已经解决了这个问题。

输入示例 JSON 记录,输入文件的每行一个。

{"review_id":"Amo5gZBvCuPc_tZNpHwtsA","user_id":"DzZ7piLBF-WsJxqosfJgtA","business_id":"qx6WhZ42eDKmBchZDax4dQ","星星":5.0,"有用":1,"有趣":0 ,"cool":0,"text":"我们的家人喜欢这里的食物。快捷、友好、美味,是一家适合带 child 去的很棒的餐厅。5 颗星!","date":"2017-03-27 01 :14:37"}

最佳答案

首先,你的

path 'file://localhost/Users/.../DSC_Intro/'

不是有效的 python 代码。如果您尝试这样执行,您将收到无效语法错误。那么,我假设这只是显示路径变量的值。我不知道这些省略号是字面意思还是您的环境截断 path 显示的结果。我在这里假设您的路径是系统的有效文件 URL,因为这里考虑不正确的路径似乎没有密切关系。

无论哪种方式,是的,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 文档中的一些内容:

Signature: pd.read_json( path_or_buf=None, ...

path_or_buf : a valid JSON string or file-like, default: None The string could be a URL. Valid URL schemes include http, ftp, s3, gcs, and file. For file URLs, a host is expected. For instance, a local file could be file://localhost/path/to/table.json

因此,使用 read_json,您可以给它一个有效 JSON 的实际字符串,也可以给它一个指向包含 JSON 的文件的类文件对象。

您引用的 pandas 文档中的注意事项:

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() 的作用。因此,当您将描述文件 URL 的字符串包装在 StringIO() 中时,我希望 read_json 会尝试将该字符串解释为从文件读取的 JSON 并解析它。它失败是可以理解的,因为它不是 JSON。

这让我们回到了为什么 read_json 无法分块读取文件 URL 的问题。我对此没有立即好的答案。我怀疑它在于 read_json 如何打开文件 URL 的内部结构,或者其背后的函数是什么。如果您有意或被迫从文件 URL 进行此分块,那么我怀疑您会考虑控制文件打开的模式,或者可能以某种方式为 read_json 提供明确的指导> 如何解释它获得的字节流。我不确定像 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 不使用正斜杠路径分隔符,并且通过以上述方式连接字符串来构造路径可能很脆弱,但通常如果您使用“正确的”正斜杠分隔符(微笑),体面的语言内部会理解这一点。它使用反斜杠构建路径,这肯定会给您带来痛苦。但请留意这一点。

关于python - ValueError 使用 pd.read_json 读取大数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56727700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com