我目前正在阅读io模块的文档:https://docs.python.org/3.5/library/io.html?highlight=stringio#io.TextIOBase
也许是因为我对Python不够了解,但在大多数情况下,我只是不理解它们的文档。
我需要将addresses_list
中的数据保存到csv文件中,并通过https提供给用户。所以所有这些都必须发生在记忆中。这是它的代码,目前它运行良好。
addresses = Abonnent.objects.filter(exemplare__gt=0)
addresses_list = list(addresses.values_list(*fieldnames))
csvfile = io.StringIO()
csvwriter_unicode = csv.writer(csvfile)
csvwriter_unicode.writerow(fieldnames)
for a in addresses_list:
csvwriter_unicode.writerow(a)
csvfile.seek(0)
export_data = io.BytesIO()
myzip = zipfile.ZipFile(export_data, "w", zipfile.ZIP_DEFLATED)
myzip.writestr("output.csv", csvfile.read())
myzip.close()
csvfile.close()
export_data.close()
# serve the file via https
现在的问题是,我需要用cp1252而不是utf-8编码csv文件的内容。传统上,我只需编写f = open("output.csv", "w", encoding="cp1252")
,然后将所有数据转储到其中。但是对于内存中的流,它不是这样工作的。io.StringIO()
和io.BytesIO()
都不接受参数encoding=
。
这就是我了解文档的地方:
TextIOBase文档中详细描述了文本流API。
encoding= 编码的名称,用于将流的字节解码为字符串,并将字符串编码为字节。
但io.StringIO(encoding="cp1252")
只是抛出:TypeError: 'encoding' is an invalid keyword argument for this function
。
那么,如何将TextIOBase的enconding参数与StringIO一起使用呢?或者一般情况下是如何工作的呢?我真的很困惑。
发布于 2017-11-15 14:20:47
StringIO只处理字符串/文本。它对编码或字节一无所知。做你想做的事情最简单的方法可能是:
f = StringIO()
f.write("Some text")
# Old-ish way:
f.seek(0)
my_bytes = f.read().encode("cp1252")
# Alternatively
my_bytes = f.getvalue().encode("cp1252")
发布于 2019-01-24 14:27:27
使用io.BytesIO读取文本(在内存流中),包括编码和错误处理(python3)
这做了io.StringIO不能做的事
样本代码
>>> import io
>>> import chardet
>>> # my bytes, single german umlaut
... bts = b'\xf6'
>>>
>>> # try reading as utf-8 text and on error replace
... my_encoding = 'utf-8'
>>> fh_bytes = io.BytesIO(bts)
>>> fh = io.TextIOWrapper(fh_bytes, encoding=my_encoding, errors='replace')
>>> fh.read()
'�'
>>>
>>> # try reading as utf-8 text with strict error handling
... fh_bytes = io.BytesIO(bts)
>>> fh = io.TextIOWrapper(fh_bytes, encoding=my_encoding, errors='strict')
>>> # catch exception
... try:
... fh.read()
... except UnicodeDecodeError as err:
... print('"%s"' % err)
... # try to get encoding
... my_encoding = chardet.detect(err.object)['encoding']
... print("correct encoding is %s" % my_encoding)
...
"'utf-8' codec can't decode byte 0xf6 in position 0: invalid start byte"
correct encoding is windows-1252
>>> # retry with detected encoding
... fh_bytes = io.BytesIO(bts)
>>> fh = io.TextIOWrapper(fh_bytes, encoding=my_encoding, errors='strict')
>>> fh.read()
'ö'
https://stackoverflow.com/questions/47309512
复制相似问题