Python基础:25文件

一:文件对象

        文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的"文件". 一旦设置了合适的"钩子", 你就可以访问具有文件类型接口的其它对象, 就好像访问的是普通文件一样。

 

二:内建函数

        1:打开

        open() 内建函数成功打开文件后时候会返回一个文件对象, 否则引发一个 IOError 异常。open()的基本语法是:

file_object = open(file_name,  access_mode='r', buffering=-1)

        file_name 是要打开的文件名字, 它可以是相对路径或者绝对路径。

        可选变量access_mode也是一个字符串, 代表文件打开的模式. 通常, 文件使用模式 'r', 'w', 或是 'a'模式来打开, 分别代表读取, 写入和追加。还有个 'U' 模式, 代表通用换行符支持。

        使用 'r'或 'U' 模式打开的文件必须是已经存在的. 使用 'w' 模式打开的文件若存在则首先清空。以 'a' 模式打开的文件是为追加数据作准备的, 即使seek 到了其它的地方,所有写入的数据也会追加到文件的末尾。‘w’和‘a’模式,如果文件不存在, 将被自动创建。

        其他fopen支持的模式,open也可以支持,比如'b',但是对于所有 POSIX 兼容的Unix 系统(包括Linux)来说, 'b'是可由可无的。

        如果没有给定 access_mode , 它将自动采用默认值'r'。下表总结了文件的打开模式:

r

 以读方式打开,文件必须存在

rU 或 U

 以读方式打开, 同时提供通用换行符支持 (PEP 278),文件必须存在

w

 以写方式打开,文件存在则清空,不存在则创建。

a

 以追加模式打开,文件不存在则创建。不可读;即使用seek指定了文件指针,也会添加在末尾。

r+

 以读写模式打开,文件必须存在

w+

 以读写模式打开 (参见 w )

a+

 以读写模式打开 (参见 a )

rb

 以二进制读模式打开

wb

 以二进制写模式打开 (参见 w )

ab

 以二进制追加模式打开 (参见 a )

rb+

 以二进制读写模式打开 (参见 r+ )

wb+

 以二进制读写模式打开 (参见 w+ )

ab+

 以二进制读写模式打开 (参见 a+ )

 

        可选参数buffering 用于指示访问文件所采用的缓冲方式. 其中0 表示不缓冲, 1表示行缓冲, 任何其它大于 1 的值代表使用给定值作为缓冲区大小。不提供该参数或者给定负值代表使用系统默认缓冲机制,一般情况下使用系统默认方式即可。

        file()和open()函数具有相同的功能, 可以任意替换。任何使用 open() 的地方, 都可以使用 file() 替换它。一般说来, 建议使用 open() 来读写文件。

 

        2:通用换行符支持

        不同平台的行结束符号是不同的, 例如 , , 或者 . 所以,Python需要用相同的方式处理所有文件。这就是 UNS 的关键所在。

        当使用'U' 标志打开文件的时候, 所有的行分割符(或行结束符),无论它原来是什么,通过 Python 的输入方法(read*()函数)返回时,都会被替换为换行符NEWLINE( )。这个特性还支持包含不同类型行结束符的文件。

        文件对象的newlines属性会记录它曾“看到的”文件的行结束符。如果文件刚被打开, 程序还没有遇到行结束符, 那么文件的newlines为 None .在第一行被读取后, 它被设置为第一行的结束符. 如果遇到其它类型的行结束符, 文件的newlines会成为一个包含每种格式的元组。

        注意UNS只用于读取文本文件. 没有对应的处理文件输出的方法。在编译Python 的时候,UNS 默认是打开的。

 

        3:输入

        read()方法直接读取字节到字符串中, 最多读取给定数目个字节。如果没有给定 size参数(默认值为 -1)或者 size 值为负,文件将被读取直至末尾。未来的某个版本可能会删除此方法。

        readline()方法读取打开文件的一行(读取下个行结束符之前的所有字节).然后包括行结束符的整行,作为字符串返回。和 read() 相同, 它也有一个可选的 size 参数, 默认为 -1, 代表读至行结束符。如果提供了该参数, 那么在超过size个字节后会返回不完整的行。

        readlines()会读取所有(剩余的)行,然后把它们作为一个字符串列表返回。它的可选参数 sizhint 代表返回的最大字节大小。如果它大于 0 , 那么返回的所有行应该大约有 sizhint 字节,可能稍微大于这个数字, 因为需要凑齐缓冲区大小。

        read、readline、readlines三个方法,在读到末尾的时候,会返回空字符串或者空列表。

 

        4:输出

        write()内建方法功能与 read() 和 readline() 相反. 它把含有文本数据或二进制数据块的字符串写入到文件中去。

        和 readlines()一样,writelines()方法是针对列表的操作, 它接受一个字符串列表作为参数, 将它们写入文件。注意,行结束符并不会被自动加入, 所以如果需要的话, 你必须在调用writelines()前给每行结尾加上行结束符。

 

        注意,当使用输入方法如 read() 或者 readlines() 从文件中读取行时, Python 并不会删除行结束符。

        类似地, 输出方法write() 或 writelines() 也不会自动加入行结束符. 应该在向文件写入数据前自己完成。

 

        5:文件定位

file.seek(offset[, whence])

        seek()方法(类似 C 中的 fseek() 函数)可以在文件中移动文件指针到不同的位置. offset字节代表相对于某个位置偏移量。

        whence的默认值为 0(os.SEEK_SET), 代表从文件开头算起(即绝对偏移量);1(os.SEEK_CUR)代表从当前位置算起;2(os.SEEK_END) 代表从文件末尾算起。                

        tell() 方法是对 seek() 的补充; 它告诉你当前文件指针在文件中的位置。从文件起始算起,单位为字节。

 

三:文件迭代

        一行一行访问文件很简单,使用下面的方法:

for eachLine in f:
        ......

        在这个循环里, eachLine代表文本文件的一行(包括末尾的行结束符)。

        在 Python 2.2 之前,从文件中读取行的最好办法是使用 file.readlines() 来读取所有数据,这样程序员可以尽快释放文件资源.如果不需要这样做, 那么程序员可以调用 file.readline()一次读取一行。

        在 Python 2.2 中,引进了迭代器和文件迭代, 这使得一切变得完全不同, 文件对象成为了它们自己的迭代器, 这意味着用户不必调用 read*() 方法就可以在for 循环中迭代文件的每一行。

文件迭代更为高效。

 

四:其他

        close()用来关闭文件。Python垃圾收集机制也会在文件对象的引用计数降至零的时候自动关闭文件。如果不显式地关闭文件, 那么有可能丢失输出缓冲区的数据。

        fileno()方法返回打开文件的描述符. 这是一个整数, 可以用在如 os 模块( os.read() )的一些底层操作上。

        调用 flush() 方法会直接把内部缓冲区中的数据立刻写入文件, 而不是被动地等待输出缓冲区被写入。

        isatty()是一个布尔内建函数, 当文件是一个类 tty 设备时返回True , 否则返回False。

        truncate()方法将文件截取到当前文件指针位置或者到给定 size , 以字节为单位。如果没有给定size ,则默认将文件截取到当前位置。        

 

五:文件属性

        文件对象还有一些数据属性。例如文件名(file.name ), 文件的打开模式 ( file.mode ), 文件是否已被关闭 ( file.closed)等等。

下表列出了这些属性并做了简短说明:

 

file.closed                    

 True表示文件已经被关闭, 否则为 False

file.encoding

 文件所使用的编码 - 当 Unicode 字符串被写入数据时, 它们将自动使用 file.encoding 转换为字节字符串; 若file.encoding 为 None 时使用系统默认编码

file.mode

 文件打开时使用的访问模式

file.name

 文件名

file.newlines

 未读取到行分隔符时为 None , 只有一种行分隔符时为一个字符串, 当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束符的列表。

file.softspace

 为0 表示在输出一数据后,要加上一个空格符,1 表示不加。这个属性一般程序员用不着,由程序内部使用。



六:标准文件

        一般说来, 只要程序一执行,就可以访问三个标准文件。它们分别是标准输入,标准输出和标准错误输出。这些文件已经被预先打开了,只要知道它们的文件句柄就可以随时访问这些文件。


        这些文件沿用的是 C 语言中的命名, 分别为stdin , stdout和 stderr。

        Python 中可以通过 sys 模块来访问这些文件的句柄。导入 sys 模块以后, 就可以使用sys.stdin , sys.stdout 和 sys.stderr 访问。

 

七:命令行参数

        sys模块通过 sys.argv 属性提供了对命令行参数的访问。在C语言中,argc 和 argv 分别代表参数个数和参数向量。

        而在Python 中, sys.argv 是命令行参数的列表,len(sys.argv) 是命令行参数的个数(也就是 argc)。

        Python还提供了两个模块用来辅助处理命令行参数. 其中一个是 getopt 模块, 它更简单些, 但是不是很精细。而 Python 2.3 引入的 optparse 模块提供了一个更强大的工具,而且它更面向对象。

        如果你只是用到一些简单的选项, 推荐 getopt , 但如果需要提供复杂的选项, 那么请参阅 optparse。

 

八:os模块

        对文件系统的访问大多通过 Python 的 os 模块实现. 该模块是Python访问操作系统功能的主要接口. os 模块实际上只是真正加载的模块的前端, 而真正的那个"模块"明显要依赖与具体的操作系统。

        这个"真正"的模块可能是以下几种之一: posix (适用于 Unix 操作系统), nt (Win32), mac(旧版本的 MacOS), dos (DOS), os2 (OS/2)等。不需要直接导入这些模块.只要导入 os 模块, Python 会为你选择正确的模块, 从而不需要考虑底层的工作。

 

        比如,不同的操作系统,它们所支持的行分隔符不同。另一个不同是路径分隔符(POSIX 使用 "/", DOS 和 Windows 使用 ""等)。

        如果需要创建跨这三个平台的应用的时候, os 模块设计者已经帮我们想到了这些差异问题.os 模块有五个很有用的属性。它们被列在了下表中:

linesep

 用于在文件中分隔行的字符串

sep

 用来分隔文件路径名的字符串

pathsep

 用于分隔文件路径的字符串

curdir

 当前工作目录的字符串名称

pardir

 (当前工作目录的)父目录字符串名称

        不管你使用的是什么平台, 只要你导入了 os 模块, 这些变量自动会被设置为正确的值。

 

原文地址:https://www.cnblogs.com/gqtcgq/p/7247183.html