Python 3中的io.StringIO vs open()

时间:2018-05-18 19:56:47

标签: python python-3.x

我能找到的只有statement

  

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

     

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

     

内存中的文本流也可用作StringIO对象:

     

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

但是,当我应该open()使用io.StringIO而不是open()时,这根本没有提供任何见解。我知道他们在幕后的工作方式并不完全相同。但是为什么有人会在Python 3中使用import urllib2 from google.oauth2 import service_account # Constants ENDPOINT_URL = 'ml.googleapis.com/v1/projects/{project}/models/{model}:predict?access_token=' SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin'] SERVICE_ACCOUNT_FILE = 'service.json' credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES) access_token=credentials.get_access_token() opener = urllib2.build_opener(urllib2.HTTPHandler) request = urllib2.Request(ENDPOINT_URL) request.get_method = lambda: 'POST' result = opener.open(request).read() print(str(result))

1 个答案:

答案 0 :(得分:7)

区别在于: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, ...)