Python 这是什么(在with语句中)?它是一个变量,还是其他什么?
我正在使用Python3.x。有人能给我解释一下下面代码块中的Python 这是什么(在with语句中)?它是一个变量,还是其他什么?,python,python-3.x,Python,Python 3.x,我正在使用Python3.x。有人能给我解释一下下面代码块中的文件是什么吗 with open(filename, "a") as file: file.write("Hello world") print(file) #I added this line to try to understand what 'file' is. 当我运行上述代码时,print(file)生成了以下内容: <_io.TextIOWrapper name='Class_A.txt' mode
文件是什么吗
with open(filename, "a") as file:
file.write("Hello world")
print(file) #I added this line to try to understand what 'file' is.
当我运行上述代码时,print(file)
生成了以下内容:
<_io.TextIOWrapper name='Class_A.txt' mode='a' encoding='cp1252'>
我不明白。我可以看出它与with语句相关,但它看起来不像一个变量
那么什么是文件
?它是一个变量,还是其他什么?如果它是一个变量,它是什么数据类型?是,文件
是一个变量,引用由open()
返回的上下文管理器生成的任何内容。它恰好是同一个对象。换句话说,file
引用文件对象
您也可以这样做,在这里达到相同的效果:
file = open(filename, "a")
try:
file.write("Hello world")
finally:
file.close()
因此,文件将自动关闭。这是因为文件对象是上下文管理器;他们支持这项计划。从技术上讲,将context\u manager作为目标变量的绑定到context\u manager的返回值。\uuu enter\uuu()
,但file对象从该方法返回自身,文件。\uu exit\uu()
方法关闭该文件。看
现在,当您打印没有字符串表示的对象时,它将使用repr()
函数进行打印:
>>> repr(open('/dev/null'))
"<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>"
>>> print(repr(open('/dev/null')))
<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>
文件对象的名称在这里也可能会混淆。这是因为Python中的文件对象是由定义的一系列对象的一部分;a包装缓冲区(此处为a,它将以以下形式包装原始二进制文件对象):
devnull=open('/dev/null',r')
>>>德夫努尔
>>>德夫努尔缓冲区
>>>devnull.buffer.raw
这些都是你通常不需要担心的技术细节。每个对象都执行特定的功能,需要进行更高级I/O争论的人可以混合和匹配这些功能。这是一个对象的文本表示,当它没有自己的\uuuu repr\uu
或\uu str\uuu
文件
是一个变量le,它指向在with语句中创建的对象。它是由打开(文件名,“a”)
上下文管理器调用返回的对象。\u io.TextIOWrapper
是一个可以执行读取、写入、查找和关闭等操作的对象
执行此操作时:
with thing1 as thing2:
调用方法thing1.\uuuu enter\uuu
,并将其返回的任何内容分配给变量/namething2
因此,是的,在您的示例中,文件
确实是一个变量,它已被分配给使用
上下文管理器返回的任何对象。在这种情况下,它是一个\u io.TextIOWrapper
对象。这就是为什么您这样做:
print(file)
你会得到:
<_io.TextIOWrapper name='Class_A.txt' mode='a' encoding='cp1252'>
注意,open(filename,“a”)。\uu enter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo()
返回的对象与从open(filename,“a”)
返回的
如果您觉得所有这些都让人困惑,我建议您多读一点关于的内容。它是一个变量,它存储了一个TextIOWrapper
对象。这是怎么回事?为什么它看起来不像一个变量?为什么它不存储任何东西?为什么你认为它不是一个变量?从你的问题来看,混淆的地方不清楚。文档是免费提供的。“暂时搁置,因为你不清楚你在问什么…”-几小时前我换了帖子,以明确我在问什么。很清楚,我们两个至少,我们已经成功地简单有效地回答了这个问题。嘿,伙计们,仅仅因为你们不理解它并不意味着其他人不清楚。所以file
是一个充当上下文管理器的变量吗?file
是名称,引用了一个充当上下文管理器的对象。我不明白……两者之间有区别n名称(变量)和它们引用的东西,对象。请参阅,以获得关于这意味着什么的良好解释。好的。但是变量的数据类型呢?我认为所有变量都有数据类型,那么它是什么数据类型呢?
print(file)
<_io.TextIOWrapper name='Class_A.txt' mode='a' encoding='cp1252'>
file = open(filename, "a").__enter__()
print(file) # same file-like object you were getting before
file.write('a line') # do stuff with it
file.close() # close it