首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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语句,则可以避免必须显式调用此方法。例如,下面的代码将在退出块时自动关闭fwith

代码语言:javascript
复制
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中,您需要这样做才能获得相同的效果:

代码语言:javascript
复制
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_SET0(绝对文件定位); 其他值是os.SEEK_CUR1(相对于当前位置寻找)和os.SEEK_END2(相对于文件结尾寻找)。没有返回值。

例如,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以跟踪其内部状态。

扫码关注腾讯云开发者

领取腾讯云代金券