Types: 9. File Objects
9. File Objects
文件对象使用C的stdio
包来实现,并且可以使用内置open()
函数来创建。文件对象也由其他一些内置函数和方法返回,比如os.popen()
和os.fdopen()
和makefile()
套接字对象的方法。可以使用该tempfile
模块创建临时文件,并且可以使用shutil模块实现高级文件操作,例如复制,移动和删除文件和目录。
当文件操作由于I / O相关原因而失败时,IOError
会引发异常。这包括由于某些原因未定义操作的情况,例如seek()
在tty设备上或写入打开以供阅读的文件。
文件有以下方法:
file.close()
关闭文件。已关闭的文件不能再被读取或写入。任何要求文件打开的操作将ValueError
在文件关闭后生成一个文件。close()
允许多次呼叫。
从Python 2.5开始,如果使用with
语句,则可以避免必须显式调用此方法。例如,下面的代码将在退出块时自动关闭f
with
:
from __future__ import with_statement # This isn't required in Python 2.6
with open("hello.txt") as f:
for line in f:
print line,
在旧版本的Python中,您需要这样做才能获得相同的效果:
f = open("hello.txt")
try:
for line in f:
print line,
finally:
f.close()
注释
并非所有Python中的“类文件”类型都支持用作with
语句的上下文管理器。如果您的代码旨在用于任何类似文件的对象,则可以使用该函数contextlib.closing()
而不是直接使用该对象。
file.flush()
冲洗内部缓冲区,如stdio
's fflush()
。这可能对某些类似文件的对象没有作用。
注释
flush()
不一定会将文件的数据写入磁盘。使用flush()
后面的os.fsync()
来确保这种行为。
file.fileno()
返回底层实现使用的整数“文件描述符”,以从操作系统请求I / O操作。这对于使用文件描述符的其他较低级别的接口(如fcntl
模块或os.read()
和朋友)可能很有用。
注释
类文件不
具有真正的文件描述符应该对象不
提供这个方法!
file.isatty()
返回True
如果文件被连接到一个tty(样)的装置,别的False
。
注释
如果一个类文件对象是不
是一个真正的文件相关联,这种方法应该不
被执行。
file.next()
一个文件对象是它自己的迭代器,例如iter(f)
返回f
(除非f
关闭)。当一个文件被用作迭代器时,通常在一个for
循环中(例如,for line in f: print line.strip()
),该next()
方法被重复调用。此方法返回下一个输入行,或者StopIteration
在文件打开时读取EOF时触发EOF(当文件打开时,行为未定义)。为了使for
循环成为循环遍历文件行的最有效方式(非常常见的操作),该next()
方法使用隐藏的预读缓冲区。由于使用预读缓冲区,结合next()
其他文件方法(如readline()
)不能正常工作。但是,使用seek()
将文件重新定位到绝对位置将刷新预读缓冲区。
2.3版本的新功能。
file.read([size])
从文件中读取大小最大的
字节(如果在读取大小
字节之前读取命中EOF,则读取次数更少)。如果size
参数为负值或省略,请读取所有数据,直到达到EOF。字节以字符串对象的形式返回。立即遇到EOF时返回空字符串。(对于某些文件,如ttys,在EOF命中后继续读取是有意义的。)请注意,此方法可能会fread()
多次调用基础C函数以努力获取尽可能接近大小的
字节。还要注意的是,当处于非阻塞模式时,即使没有给出大小
参数,也可能返回比请求的数据更少的数据。
注释
这个函数只是底层fread()
C函数的一个包装,并且在角落情况下表现得相同,比如EOF值是否被缓存。
file.readline([size])
从文件中读取整行。尾随的换行符保存在字符串中(但当文件以不完整的行结尾时可能不存在)。[6]如果size
参数存在且非负数,则它是最大字节数(包括尾随换行符),并且可能返回不完整的行。当size
不是0时,仅
当立即遇到EOF 时才
返回空字符串。
注释
与stdio
不同的是fgets()
,如果返回的字符串'\0'
出现在输入中,则返回的字符串包含空字符()。
file.readlines([sizehint])
阅读直到使用EOF,readline()
并返回包含这样读取的行的列表。如果存在可选的sizehint
参数,而不是读取到EOF,则会
读取总计约为sizehint
字节的整行(可能在四舍五入到内部缓冲区大小之后)。实现类似文件的界面的对象可能会选择忽略sizehint,
如果它无法实现,或无法有效实施。
file.xreadlines()
此方法返回与之相同的内容iter(f)
。
2.1版本中的新功能。
自2.3版弃用:for line in file
改为使用。
file.seek(offset[, whence])
设置文件的当前位置,如stdio
's fseek()
。的何处
参数是可选的,缺省值是os.SEEK_SET
或0
(绝对文件定位); 其他值是os.SEEK_CUR
或1
(相对于当前位置寻找)和os.SEEK_END
或2
(相对于文件结尾寻找)。没有返回值。
例如,f.seek(2, os.SEEK_CUR)
将位置提前两位,f.seek(-3, os.SEEK_END)
并将位置设置为倒数第三位。
请注意,如果打开文件以进行追加(模式'a'
或'a+'
),seek()
则在下次写入时将取消所有操作。如果文件仅在追加模式(模式'a'
)下打开才能打开,则此方法本质上是无操作的,但对于在启用读取(模式'a+'
)的附加模式下打开的文件仍然有用。如果文件以文本模式打开(不带'b'
),则只有返回的偏移量tell()
是合法的。使用其他偏移导致未定义的行为。
请注意,并非所有文件对象都是可搜索的。
在版本2.6中更改:将浮点值传递为偏移量已被弃用。
file.tell()
返回文件的当前位置,如stdio
's ftell()
。
注释
在Windows上,当读取具有Unix风格的行结尾的文件时,tell()
可以返回非法值(之后fgets()
)。使用二进制模式('rb'
)来解决这个问题。
file.truncate([size])
截断文件的大小
。如果可选大小
参数存在,则该文件被截断为(最多)该大小
。大小
默认为当前位置。当前文件位置不变。请注意,如果指定大小
超过文件的当前大小
,则结果将取决于平台:可能性包括文件可能保持不变,增加到指定的大小
,就像零填充一样,或者用未定义的新内容增加到指定的大小
。可用性:Windows,许多Unix变体。
file.write(str)
将一个字符串写入文件。没有返回值。由于缓冲,在调用flush()
or close()
方法之前,字符串可能实际上不会显示在文件中。
file.writelines(sequence)
将一串字符串写入文件。序列可以是任何可生成字符串的可迭代对象,通常是字符串列表。没有返回值。(该名称旨在匹配readlines(
writelines()不添
加行分隔符。)
文件支持迭代器协议。每次迭代都会返回相同的结果readline()
,并且当readline()
方法返回空字符串时迭代结束。
文件对象还提供了许多其他有趣的属性。对于类似文件的对象,这些不是必需的,但是如果它们对于特定对象有意义的话应该被实现。
file.closed
bool表示文件对象的当前状态。这是只读属性; 该close()
方法更改值。它可能不适用于所有类文件对象。
file.encoding
该文件使用的编码。当Unicode字符串写入文件时,它们将被转换为使用此编码的字节字符串。另外,当文件连接到终端时,该属性给出终端可能使用的编码(如果用户配置了终端,则该信息可能不正确)。该属性是只读的,可能不会出现在所有类文件对象上。也可能是None
,在这种情况下,文件使用系统默认编码来转换Unicode字符串。
2.3版本的新功能。
file.errors
Unicode错误处理程序与编码一起使用。
2.6版本中的新功能。
file.mode
文件的I / O模式。如果文件是使用open()
内置函数创建的,则这将是mode
参数的值。这是一个只读属性,可能不会出现在所有类文件对象上。
file.name
如果文件对象是使用创建open()的文件的名称。否则,一些字符串指示表单的文件对象的来源<...>。这是一个只读属性,可能不会出现在所有类文件对象上。
file.newlines
如果Python是使用通用换行符(默认值)构建的,则此只读属性存在,对于以通用换行读取模式打开的文件,它会跟踪读取文件时遇到的换行符类型。它可以采取的值'\r'
,'\n'
,'\r\n'
,None
(未知,没有换行读还)或包含所有看到的换行符类型,元组,指示中所遇到的多个换行符约定。对于未以通用换行符读取模式打开的文件,此属性的值将为None
。
file.softspace
指示在使用print
语句时是否需要在另一个值之前打印空格字符的布尔值。试图模拟文件对象的类也应该有一个可写softspace
属性,该属性应该初始化为零。对于大多数在Python中实现的类,这将是自动的(对于覆盖属性访问的对象可能需要注意); 用C实现的类型必须提供一个可写的softspace
属性。
注意
该属性不用于控制print
语句,但允许执行print
以跟踪其内部状态。