首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在内存流中编码,或者TextIOBase是如何工作的?

在内存流中编码,或者TextIOBase是如何工作的?
EN

Stack Overflow用户
提问于 2017-11-15 14:06:25
回答 2查看 4K关注 0票数 2

我目前正在阅读io模块的文档:https://docs.python.org/3.5/library/io.html?highlight=stringio#io.TextIOBase

也许是因为我对Python不够了解,但在大多数情况下,我只是不理解它们的文档。

我需要将addresses_list中的数据保存到csv文件中,并通过https提供给用户。所以所有这些都必须发生在记忆中。这是它的代码,目前它运行良好。

代码语言:javascript
运行
复制
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。

TextIOBase文档说:

encoding= 编码的名称,用于将流的字节解码为字符串,并将字符串编码为字节。

io.StringIO(encoding="cp1252")只是抛出:TypeError: 'encoding' is an invalid keyword argument for this function

那么,如何将TextIOBase的enconding参数与StringIO一起使用呢?或者一般情况下是如何工作的呢?我真的很困惑。

EN

回答 2

Stack Overflow用户

发布于 2017-11-15 14:20:47

StringIO只处理字符串/文本。它对编码或字节一无所知。做你想做的事情最简单的方法可能是:

代码语言:javascript
运行
复制
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")
票数 1
EN

Stack Overflow用户

发布于 2019-01-24 14:27:27

使用io.BytesIO读取文本(在内存流中),包括编码和错误处理(python3)

这做了io.StringIO不能做的事

样本代码

代码语言:javascript
运行
复制
>>> 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()
'ö'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47309512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档