Fix printing of CSV to stdout in py3

This commit is contained in:
Kovid Goyal 2020-04-23 16:55:58 +05:30
parent 7f7d7efe6d
commit 0563676263
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -7,10 +7,9 @@ from __future__ import absolute_import, division, print_function, unicode_litera
import csv import csv
import sys import sys
from textwrap import TextWrapper from textwrap import TextWrapper
from polyglot.io import PolyglotBytesIO
from calibre import prints from calibre import prints
from polyglot.builtins import unicode_type, map from polyglot.builtins import as_bytes, map, unicode_type
readonly = True readonly = True
version = 0 # change this if you change signature of implementation() version = 0 # change this if you change signature of implementation()
@ -123,16 +122,22 @@ def do_list(fields, data, opts):
print() print()
class StdoutWriter:
def __init__(self):
self.do_write = getattr(sys.stdout, 'buffer', sys.stdout).write
def write(self, x):
x = as_bytes(x)
self.do_write(x)
def do_csv(fields, data, opts): def do_csv(fields, data, opts):
buf = PolyglotBytesIO() csv_print = csv.writer(StdoutWriter(), opts.dialect)
csv_print = csv.writer(buf, opts.dialect)
csv_print.writerow(fields) csv_print.writerow(fields)
for d in data: for d in data:
row = [d[f] for f in fields] row = [d[f] for f in fields]
csv_print.writerow([ csv_print.writerow(row)
x if isinstance(x, bytes) else unicode_type(x).encode('utf-8') for x in row
])
print(buf.getvalue())
def main(opts, args, dbctx): def main(opts, args, dbctx):