我听说一切都是python中的一个对象。如果是这样,为什么转换一个字符串(可以假设一个驻留在python内存中的对象)使用像StringIO或CStringIO这样的模块转换为像object这样的文件?
答案 0 :(得分:1)
因为某些函数是在假设他们收到一个打开的文件作为参数的情况下编写的。
def example_process_file_contents(opened_file):
# Skip first line, it's a header
opened_file.readline()
# Process the rest line by line
for line in opened_file:
do_something_with(line)
现在假设您没有文件中的数据,而是内存中的字符串。如果将该字符串放在StringIO对象中,则现在有一个对象的行为与打开的文件对象完全相同(因此文件类似于对象),您可以将其传递给该函数。
将字符串写入文件,打开文件进行读取,然后传递...
答案 1 :(得分:1)
仅仅因为一切都是对象并不意味着一切都是相同的类对象(类)。
String
对象支持某些方法 - 比如uppercase()
返回将其转换为大写的版本等等。
类文件对象(例如StringIO
)支持不同的方法,
比如读掉前几个字节,然后快速追加。
我今天大部分时间都在处理的一个例子: Swift client.put_object需要:
内容 - 一个字符串,一个类文件对象或一个可读取对象数据的迭代;如果为None,则将执行零字节放置。
我想从内存上传一些二进制数据。
就我而言,它是一个HDF5对象。
但那不是string
,也不是file-like object
。
它是可迭代的,但它不是string
或file-like object
的可迭代(这是文档未提及的要求)。
它不是兼容类型。
我将HDF5对象保存到StringIO
,然后我用Swift
上传,因为这是Swift可以使用的一种对象。
我无法将其保存为字符串,因为Save方法不会创建字符串 - 它被设置为仅保存到类文件对象 - 因为它旨在用于文件。
不同的班级不同。
在那个比喻中,有问题的对象是Nothing的不同形式。
一个空列表和一个空。
但它们并不是一样的。
一个没有纸的罐子和一个没有蝎子的罐子是不一样的。