今天学习文件。
打开文件
打开文件我们可以使用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() | 关闭队列 |