文件I/O深入浅出
引言:
i/o即输入输出流,python中print()函数便将内容输出到屏幕上,
实际上print()函数是对sys.stdout.write()函数的良好封装,
即输出到屏幕这个动作实际上时将其write到了stdout这个流中
那么,我们也可以将要打印的内容存入其他流中,譬如文件流
打开文件流 open
open('file','mode',buffer,encoding,)
file:文件
mode:文件打开模式
r,w,a,+,b
r: 要求file已经存在,打开文件后。文件指针位于开头
w: 打开或者创建file ,清空文件内容f.tell()=0
a; 追加模式,f.tell()=end
+: 例如r+,w+, a+,表示文件可读可写
b: bytes模式,例如rb, 需要decode()后才能正常显示文本
buffer:缓冲
0(False):不缓冲
1(True):缓冲
>1:指定缓冲区大小
<0:默认缓冲区大小
encoding:编码方式
编码方式引发的问题
常见的编码方式
想了解更多?点击 编码方式的比较
处理乱码问题:解码编码方式要一致
1.以b 模式打开文件,获取二进制数据,再通过decode(' ')解码
2.打开文件时指定编码方式,encoding=' ';
读取文件流 read/readline/…
read(n):一次读取n个字符
readline(n):一次读取一行,至多n个字符
当没有参数n时,默认全部读取
readlines:读取所有行
读取多个输入流
fileinput 模块
fileinput.input(files=(file1,file2,))
fileinput.filename:文件名
fileinput.fileno:文本描述符=====>文件的代号
fileinput.lineno:当前读取的行号f
fileinput.filelineno:当前读取的行在文件中行号
文件迭代器
f = open('a.txt','w',1)
#可以将文件流当成迭代器遍历
for line in f:
print(line)
管道符
type a.txt| python b.py|python c.py
type a.txt 的运行结果将会作为b.py的输入,
b.py 的运行结果将会传给c.py... ...
linecache 读取(特指 python 源码)指定行
import linecache
import random
# 读取random 源码的第三行
print(linecache.getline(random.__file__,3))
# 实际上linecache以utf-8字符集读取,所以只要文件是以
# utf-8编码方式编码的,就可以读取
# a.txt 采用utf-8字符集存储
print(linecache.getline('a.txt',3))
写入文件流 write
write(str/bytes);
writelines(iterator):写入多行,iterator为可迭代对象,
譬如list,set,dict,tuple,deque,(and so on ...)
文件指针
读写文件时,文件指针回自动向后移动
seek(offset,whence)
whence:
0(不填):定位在开头位置
1:定位在当前位置
2:定位在结尾位置
offset:
在定位位置whence的基础上,移动文件指针offset个字符
tell():返回当前文件指针位置
Example:
import os
f = open('a.txt','r', 1, 'utf-8')
while True:
content = f.read(1)
if not content:break
print(content)
poem = ('床前明月光'+os.linesep,\
'疑是地上霜'+os.linesep,\
'举头望明月'+os.linesep,\
'... ...')
f.writelines(poem)
f.close() # 关闭文件流,避免资源浪费
关闭文件流 close
try:…finally:…
将f.close()语句放在finally 中,保证文件流关闭
with语句
使用with 来管理资源关闭,但是使用with管理的资源必须是一个实现上下文管理协议的类,这个类的对象可以被称为上下文管理器
实现context_manager上下文管理器
context_manager.__enter__(self):pass
进入上下文管理器时自动调用,返回值将赋值给as后的元组变量
context_manager.__exit__(self,exc_type,exc_value,exc_traceback):pass
退出时自动调用
open()实现了这两个函数,可以被with语句管理
with open(file, mode, buffer,encoding) as f:
pass
本文用于定期复习,如有错误,请指出