【问题标题】:Decoding bytes CSV results in string with 'b' prefix解码字节 CSV 生成带有“b”前缀的字符串
【发布时间】: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


【解决方案1】:

我能够让它工作,这要归功于我的 irl 朋友,他用橡皮擦让我通过了解决方案。这很简单,我需要做的是像这样对来自 to_csv 函数的结果字符串进行编码:

comments = []
body = requests.get()
for comment in body:
    comments.append([
            str(body['data']['body'])
        ])
df = pd.DataFrame(comments)[0]
csv_data = df.to_csv(index=False)
csv_data = csv_data.encode('utf-8')
requests.put('http://sample/desination.csv', data=csv_data)

我相信您可以通过将编码组合到 to_csv 函数作为标志或将其应用于结果来压缩上述代码。

现在可以正确解码上传的生成文件,并且您可以保留 csv 格式。

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2010-10-06
    • 2017-04-29
    • 2018-05-06
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多