【发布时间】:2020-07-30 02:27:38
【问题描述】:
我正在使用我通过 requests.get 在线获取的 csv,因此对于上下文,这是上传文件的方式:
import pandas as pd
import requests
comments = []
body = requests.get()
for comment in body:
comments.append([
str(body['data']['body']).encode(encoding='utf-8')
])
df = pd.DataFrame(comments)[0]
requests.put('http://sample/desination.csv', data=df.to_csv(index=False))
使用请求时需要附加到 cmets 时的编码,因为它默认为 latin-1,并且请求需要 utf-8。
生成的 csv 包含 1 列,其中的行如下: b'准确地说'
有道理,编码为 utf-8 将字符串转换为字节类型。
现在我稍后尝试解码 csv 我有以下内容:
import requests
data = requests.get('http://destination.csv').content
testdata = data.decode('utf-8').splitlines()
print(testdata[2])
b'准确地说'
如果我不解码:
print(data[1:20])
b'精确地'\r\n
我的印象是解码数据会消除 b 前缀,正如大多数 stackoverflow 答案所暗示的那样。问题可能出在我最初上传 csv 的方式上,所以我尝试了几种不同的方法,但都没有运气(无法绕过编码)。
有什么建议吗?
附: python版本3.7.7
编辑:我最终没有运气试图让它工作。 DataFrame.to_csv() 返回一个字符串,正如 lenz 指出的那样,转换为字符串类型可能是问题的罪魁祸首。
最终,我最终将数据保存为 .txt 以消除调用 to_csv() 的需要,这导致我的解码按预期工作,证实了我们的怀疑。 txt 文件格式适合我,所以我保持这种格式。
【问题讨论】:
-
可能在某处有一个(隐式)
str调用,所以值确实是"b'Precisely'"和"b'Precisely'\r\n"。 -
通过序列化一个字节对象列表(而不是先序列化,然后编码整个转储),您可能还需要单独解码每个单元格。
-
df.to_csv(encoding='utf-8')? -
@snakecharmerb 刚刚尝试在有/没有解码正文的情况下都这样做,但结果是一样的。
-
@lenz 你是对的,因为 to_csv 返回一个 str 对象,所以这可能就是问题所在。但是,当我尝试像这样解码整个主体时: datadf = pd.read_csv(io.StringIO(data.decode('utf-8'))) 然后我可以获取一个单元格: testdata = datadf.iloc[1,0 ] 但是那个单元格已经是一个无法进一步解码的字符串。您是否建议我将其转换为另一种类型以在每一行上进一步解码?
标签: python python-3.x dataframe csv utf-8