Python 3 csv.writer打印" bytes"带前缀和引号

时间:2016-08-04 14:42:29

标签: python python-3.x csv python-unicode

在Python 2中,这段代码符合我的期望:

<button ui-sref="tab.ccpo">Second tab</button>

打印:

import csv
import sys

writer = csv.writer(sys.stdout)
writer.writerow([u'hello', b'world'])

但是在Python 3中,hello,world 打印有前缀和引号:

bytes

由于CSV是一种通用的数据交换格式,并且由于除了Python之外没有其他系统知道hello,b'world' 是什么,我需要禁用此行为。但我还没弄清楚怎么做。

当然,我可以先在b'' str.decode上使用bytes,但这样做不方便且效率低下。我真正想要的是将文字字节写入文件,或者将编码(例如&#39; ascii&#39;)传递给csv.writer(),以便它知道如何解码任何bytes个对象看到。

2 个答案:

答案 0 :(得分:0)

我认为没有办法避免使用Python 3中的csv模块将字节字符串明确地转换为unicode字符串。在Python 2中,它们被隐式转换为ASCII。

为了使这更容易,您可以有效地子类化csv.writer(或换行)对象,如下所示,这将使该过程更方便。

import csv

class MyCsvWriter(object):
    def __init__(self, *args, **kwrds):
        self.csv_writer = csv.writer(*args, **kwrds)

    def __getattr__(self, name):
        return getattr(self.csv_writer, name)

    def writerow(self, row):
        self.csv_writer.writerow(
            str(v, encoding='utf-8') if isinstance(v, bytes) else v for v in row)

    def writerows(self, rows):
        for row in rows:
            self.writerow(row)

with open('bytes_test.csv', 'w', newline='') as file:
    writer = MyCsvWriter(file)
    writer.writerow([u'hello', b'world'])

答案 1 :(得分:0)

csv写入文本文件,并期望Python 3中的Unicode(文本)字符串。

csv写入二进制文件并期望Python 2中的字节字符串,但允许使用默认的ascii编解码器将Unicode字符串隐式编码为字节字符串。 Python 3不允许隐式转换,因此您无法真正避免它:

#!python3
import csv
import sys
writer = csv.writer(sys.stdout)
writer.writerow(['hello', b'world'.decode()])