当前位置: 首页 > 面试题库 >

如何将io.StringIO()与csv模块一起使用?

慕和惬
2023-03-14
问题内容

我试图将Python 3程序反向移植到2.7,但遇到了一个奇怪的问题:

>>> import io
>>> import csv
>>> output = io.StringIO()
>>> output.write("Hello!")            # Fail: io.StringIO expects Unicode
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unicode argument expected, got 'str'
>>> output.write(u"Hello!")           # This works as expected.
6L
>>> writer = csv.writer(output)       # Now let's try this with the csv module:
>>> csvdata = [u"Hello", u"Goodbye"]  # Look ma, all Unicode! (?)
>>> writer.writerow(csvdata)          # Sadly, no.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unicode argument expected, got 'str'

根据文档,io.StringIO()返回Unicode文本的内存流。当我尝试手动输入Unicode字符串时,它可以正常工作。为什么csv即使所有写入的字符串都是Unicode字符串,它也无法与模块结合使用?在什么地方str来,它使得异常?

(我知道我可以StringIO.StringIO()代替使用,但是我想知道io.StringIO()在这种情况下怎么了)


问题答案:

Python
2.7csv模块不支持Unicode输入:请参阅文档开头的注释。

看来您必须将Unicode字符串编码为字节字符串,并使用io.BytesIO而不是io.StringIO

文档的示例部分包括UnicodeReaderUnicodeWriter包装类的示例(感谢@AlexeyKachayev的指针)。



 类似资料:
  • 我正在静态站点上使用本机es6模块。 在部署之前,我通过Babel传递js文件 //网页包。配置。js //. babelrc 默认情况下,babel会将模块转换为公共js,尽管我的代码中有一个标志“modules”:false。巴别塔 我不想让babel把模块变成通用的,我只想把除了导入和导出之外的所有东西都变成es2015,这样我就可以在浏览器中使用原生模块了 像这样://main.js之前

  • 我有一个明确的模块化项目,它依赖于一个自动模块;e、 g.关于java。激活。仍然可以使用jlink吗? 查看此模块信息。爪哇: 然后jlink不能添加模块: 根据我的理解,一个自动模块无论如何都会包含整个类路径。所以我想用jlink创建运行时映像没有任何好处? 另请参阅:什么是自动模块? 有没有可能绕过这个问题?也许为这些依赖生成module-info.java?

  • 在Martin Fowler的书中,我读到了和模式。 作者提到,将identityMap放在UnitOfWork内部是一个好主意。但怎么做呢? 据我所知,受会话限制,但作者没有提到 每个unitOfWork实例需要多少个IdentityMap实例? 如果我们有两个并发请求呢?

  • 问题内容: 我正在尝试在NodeJS中使用MySQL。我的整个应用程序都是基于Promise构建的,因此我也想推广该模块。 所以我有这个: 现在,根据他们的API,该方法接受一个参数,即在发生连接错误时调用的回调。我的问题是,这如何转化为承诺? 承诺会因错误而解决吗?会被拒绝吗?我可能需要吗?这是如何运作的? 问题答案: 如果某个方法是带有单个参数的节点“ errback”-它将在中没有任何参数地

  • 我一辈子都搞不清楚如何使用java模块将jackson包含在java项目中。 我尝试了使用的组合: 什么都不管用...误差范围包括: 和… 有没有人有一个示例pom.xml/module-info.java构建?还是指向一个的指针? 注意,这是我开始的地方: pom.xml: 以及在module-info.java中