Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这是什么(在with语句中)?它是一个变量,还是其他什么?_Python_Python 3.x - Fatal编程技术网

Python 这是什么(在with语句中)?它是一个变量,还是其他什么?

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

我正在使用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='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
,并将其返回的任何内容分配给变量/name
thing2

因此,是的,在您的示例中,
文件
确实是一个变量,它已被分配给
使用
上下文管理器返回的任何对象。在这种情况下,它是一个
\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