在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
个对象看到。
答案 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()])