今天学习文件。

打开文件

打开文件我们可以使用open(’file’,’mod’)函数,默认只读模式打开。

mod 描述
‘r’ 只读
‘w’ 写入
‘x’ 独占写入
‘a’ 附加模式
‘b’ 二进制模式(与其他模式结合使用)
‘t’ 文本模式(与其他模式结合使用)
‘+’ 读写模式(与其他模式结合使用)

写入模式会删除已有内容,独占写入在文件已存在时会引发异常。,附加模式为从当前文件末尾开始写入。
通常,python使用通用换行模式,在这种模式下,readline(后面讨论)等方法能识别所有合法的换行符。(\n,\r和\r\n)如果要使用这种模式,同时禁止自动转换,可将关键字参数newline设置成空字符串,如:open(file,newline=”)。如果将\r或\r\n视为合法的行尾字符,可将参数newline设置为相应的行尾字符。这样,读取时不会对行尾字符进行转换,但写入时将把\n替换为指定的行尾字符。
如果读取非文本(如声音,图像),我们需要使用二进制模式来读取(例如rb)。
还有更高级的参数详见help(open),这里不再赘述。

基本文件操作

f=open('a.txt','w')
f.write("Hello world")
f.close()
f=open('a.txt','r')
print(f.read(4))
f.close()

我们可以通过seek对位置进行移动,参数可正可负。使用tell()返回当前位置。

迭代文件

首先介绍每个字符迭代:

with open(filename) as f:
    char=f.read(1)
    while char:
        process(char)
        char = f.read(1)

如果每次想要迭代一行,可以使用readline:

with open(filename) as f:
    while True:
        line = f.readline
        if not line: break
        process(line)

如果文件不大,我们可以读取所有内容:

with open(filename) as f:
    for line in f.readlines():
        process(line)

readlines()可以读取文件的所有行,保存在一个列表中,每行作为一个元素,但读取大文件相对会占内存。
我们也可以使用文件迭代器:

with open(fliename) as f:
    for line in f:
        process(line)

fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。相对readlines节省内存,这里成为延迟行迭代:

import fileinput 
    for line in fileinput.input(filename): 
       process(line)

fileinput全部参数:fileinput.input (files=文件路径, inplace=是否将标准输出的结果写回文件,默认False, backup=’备份文件的扩展名’, bufsize=缓冲区大小(默认为0), mode=’读写模式,默认为r’, openhook=用于控制打开的所有文件,比如说编码方式(默认None))
常用函数:

函数 描述
fileinput.input() 返回能够用于for循环遍历的对象
fileinput.filename() 返回当前文件的名称
fileinput.lineno() 返回当前已经读取的行的数量(或者序号)
fileinput.filelineno() 返回当前读取的行的行号
fileinput.isfirstline() 检查当前行是否是文件的第一行
fileinput.isstdin() 判断最后一行是否从stdin中读取)
fileinput.close() 关闭队列