【问题标题】:Parse bytes to str while reading csv with Python使用 Python 读取 csv 时将字节解析为 str
【发布时间】:2021-05-18 07:43:00
【问题描述】:

虽然我使用 python 代码写入和读取 csv 文件 utf8 字符串

import csv

test1='ab"cc"dd'.encode('utf8')
test2='bbb'.encode('utf8')
csv_file = open('test.csv','w')
writer= csv.writer(csv_file)
writer.writerow([test1,test2])
csv_file.close()

with open('test.csv', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='"')
    print(spamreader)
    for row in spamreader:
        print(', '.join(row))

问题是当我阅读时我得到的是b'ab"cc"dd', b'bbb' 而不是ab"cc"dd,bbb

如何解码该字符串(我必须将 utf8 放入 csv)?

【问题讨论】:

  • 为什么要将字节列表传递给writerow

标签: python csv utf-8 encode


【解决方案1】:

无需手动编码/解码。使用所需的特定编码打开文件,因为默认编码因操作系统配置而异。这被称为“Unicode 三明治”。写入/读取文件时进行编码/解码,仅在 Python 脚本中使用 Unicode。

另外,csv.readercsv.writer 需要 Unicode 字符串,因此提供编码的字节字符串是不正确的。

import csv

test1 = 'ab"cc"dd'
test2 = 'bbb'
with open('test.csv', 'w', encoding='utf8', newline='') as csv_file:
    writer= csv.writer(csv_file)
    writer.writerow([test1,test2])

with open('test.csv', encoding='utf8', newline='') as csvfile:
    spamreader = csv.reader(csvfile)
    for row in spamreader:
        print(row)
        print(', '.join(row))
['ab"cc"dd', 'bbb']
ab"cc"dd, bbb

此外,如果您希望 .CSV 文件在 Microsoft Excel 中可读,请使用 utf-8-sig 作为编码,否则将无法正确检测 UTF-8。

【讨论】:

    【解决方案2】:

    您可以使用 decode() 函数将字节解码为字符串。 更多信息在这里:https://docs.python.org/3/library/stdtypes.html#bytes.decode

    "b'ab""cc""dd'", b'bbb'".decode('utf-8')
    

    如果它不能正常工作,在加入它们之前解码字符串(以字节表示)。

    【讨论】:

    • 加入之前可能要解码print(', '.join([x.decode() for x in row]))
    • @MoPo @C14L 我收到错误AttributeError: 'str' object has no attribute 'decode'
    • 像 C14L 评论一样,在加入它们之前对其进行解码。 join() 形成一个字符串,你不能解码一个字符串。所以你需要解码它们然后加入它们@MicrosoctCprog
    猜你喜欢
    • 1970-01-01
    • 2022-07-04
    • 2021-07-04
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2015-10-23
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多