Python 3中的io.StringIO与open()有何不同?

8
我能找到的只有这个语句

最简单的创建文本流的方法是使用open(),可以选择指定编码:

f = open("myfile.txt", "r", encoding="utf-8")

内存文本流也可作为StringIO对象提供:

f = io.StringIO("some initial text data")

但这并没有给出什么信息,说明我何时应该使用open()而不是io.StringIO,反之亦然。我知道它们在后台的工作方式并不完全相同。 但是为什么在Python 3中会选择使用open()

1
尝试过使用io.StringIO打开文件吗? - Aran-Fey
1
提问者没有明确指出他们是特别想要打开一个文件。 - glibdud
@Aran-Fey 你有_试过_阅读这篇文章吗? - scharette
嗯,是的,我有。你说你不知道什么时候该使用哪个。如果你尝试使用它们两个,你很快就会找到答案。 - Aran-Fey
1
@Aran-Fey,我很高兴下面的答案在那里,因为这正是我想知道该使用哪个的情况。考虑到两者在这种情况下都输出了完全相同的内容,我认为了解它们之间的区别是相关的。我真的不明白你为什么要假装我没有尝试过。 - scharette
1
@Aran-Fey,你能告诉我使用csv.reader时哪种方法更好吗? - scharette
1个回答

26

区别在于:open需要一个文件名(以及其他一些参数,如模式或编码),io.StringIO需要一个普通字符串,并且两者都返回类似文件的对象。

因此:

  • 使用open来读取文件;
  • 当您需要一个类似文件的对象并且想要传递字符串的内容时,请使用StringIO

使用StringIO的示例:

import csv
import io

reader = csv.reader(io.StringIO("a,b,c\n1,2,3"))
print ([r for r in reader])
# output [['a', 'b', 'c'], ['1', '2', '3']]

非常有用,因为您可以在需要文件的地方使用字符串。

通常情况下,如果您的磁盘上有一个csv文件,您会写出类似以下的内容:

with open(<path/to/file.csv>, ...) as f:
    reader = csv.reader(f, ...)

1
简洁而精彩的例子(正是因为这个例子才让我来到这里),谢谢! - scharette
2
openStringIO都接受字符串。它们的区别在于它们对字符串的处理方式。 - user2357112
@user2357112 不错!我会编辑我的答案,添加这个细节! - jferard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接