我正在尝试使用python作为
从hdfds读取文件from hdfs.client import Client
import json,requests
if __name__ == '__main__':
cl = Client("http://hostName:port")
print cl.list("/myDir/")
with cl.read("/myDir/myFile.json") as f:
print f
print json.load(f)
但是我得到了
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
on json.load(f)
我也试过
with cl.read("/myDir/myFile.json", encoding ="utf-8") as f:
但现在我
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte
然后我试了
with cl.read("/myDir/myFile.json",encoding ="utf-8", errors='ignore') as f:
但是我得到了
TypeError: read() got an unexpected keyword argument 'errors'
有什么方法可以将文件作为简单的字符串读取?该文件看起来像
{"key1":"val1","key2":"val2","key3":"val3"...}
我正在使用python 2.7
更新
感谢@Yaron提供了有用的建议。经过一番摆弄,我想出了这个
r=requests.get('http://hostName:port/webhdfs/v1/myDir/myFile.json?op=OPEN', stream=True)
r.raw.decode_content = True
print r
print str(r.raw.read())
但是,由于某种原因,它不会读取整个文件。它只是停在中间,我不知道为什么。有什么想法吗?
另外,我仍然无法将其转换为JSON。我试过了
r=requests.get('http://hostName:port/webhdfs/v1/myDir/myFile.json?op=OPEN', stream=True)
r.raw.decode_content = True
print r
x=r.raw.read()
# print x["key1"] fails citing that string indices must be integers
print x
x=json.loads(str(x))
我得到了
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 0: invalid start byte
回到1号广场!
终于明白了
所有我必须做的是
r=requests.get('http://hostName:port/webhdfs/v1/myDir/myFile.json?op=OPEN', stream=True)
r.raw.decode_content = True
print r
x=r.raw.read().decode("utf-8",errors="ignore")
print json.loads(x)["key1"]
这给了我
<Response [200]>
value2
:)
答案 0 :(得分:1)
你试过以下其中一个:
这些应该允许非常简单的方式来读取文件作为 python 中的简单内容。这些是纯python hdfs客户端,而不是web / http hdfs包装器。
以蛇咬为例,它将是:
from snakebite.client import AutoConfigClient
c = AutoConfigClient()
next(c.text([“/user/r/foobar.txt"]))
`awesome foobar content`
编辑:说到json的例子:
> jq . test.json
{
"bar": "test",
"foo": 1
}
> hdfs dfs -put test.json
> snakebite cat test.json | jq .
{
"bar": "test",
"foo": 1
}
> python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from snakebite.client import AutoConfigClient
>>> c = AutoConfigClient()
>>> import simplejson as json
>>> next(c.text(["test.json"]))
'{"foo": 1, "bar": "test"}\n'
>>> json.loads(next(c.text(["test.json"])))
{'foo': 1, 'bar': 'test'}
答案 1 :(得分:1)
1)看pypi.python.org/pypi/hdfs - 我会一步一步地看他们的例子(看起来和你做的非常相似) - 并确保问题不在python代码中。 2)下一步是确认HDFS中实际存在/myDir/myFile.json
,并保存有效的json文件。
stackoverflow.com/a/16924225/5088142 - 说明您可以使用requests.packages.urllib3.response.HTTPResponse
阅读object.raw.read(10)
个对象 - 例如f.raw.read(10)
答案 2 :(得分:0)
with cl.read('/myDir/myFile.json', encoding='utf-8') as reader:
from json import load
model = load(reader)