py之文件io深入浅出(二)


引言:

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
本文用于定期复习,如有错误,请指出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值