文件操作二(buffering encoding newline)

buffering:缓冲区

buffering 是一个可选的整数,用于设置缓冲策略。传递0以切换缓冲关闭(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),并且>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)。如果没有给出 buffering 参数,则默认缓冲策略的工作方式如下:
二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用 io.DEFAULT_BUFFER_SIZE。在许多系统上,缓冲区的长度通常为4096或8192字节。
文本文件( isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。
演示:
二进制模式:
buffering >1 只在二进制模式可以用

import io
io.DEFAULT_BUFFER_SIZE
8192

f = open('a1','wb+',3)		 #缓冲区大小为3
f.write(b'cc')
cat a1  					 #什么也不显示
f.write(b'ooo')				 #再写3个就超过缓冲区大小 自动flush
cat a1
cc 							 #前面的cc落地

文本模式:
buffering = 1,使用行缓冲,遇到换行符数据就落地,但超过缓冲区也会落地

f = open('a','w+',1)    
f.write('acx123')    #写几个字符
f.write('\n')     	 #写个换行符
f.seek(0)
f.read()
'acx123\n'
cat a
acx123
f.write('777')
f.write('\n')
f.seek(0)
f.read()
'acx123\n777\n'
cat a             	 #两个换行符让前面的字符全落地
acx123
777

buffering = 0
特殊二进制模式,不需要内层的buffer

f = open('a1','wb+',0)
f.write(b'm')
cat a1
m      				 #写入的字符直接落地

encoding:编码,仅文本模式使用

encoding是用于解码或编码文件的编码的名称。这应该只在文本模式下使用。默认编码是依赖于平台的

f = open('a','r+',encoding='utf-8')
f.write('啊')
f.seek(0)
f.read()
'啊asdas77\n'

newline:控制换行符

newline 控制 universal newlines 模式如何生效(它仅适用于文本模式)。它可以是 None,’’,’\n’,’\r’ 和 ‘\r\n’。
工作原理:
从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 ‘\n’,’\r’ 或 ‘\r\n’ 结尾,这些行被翻译成 ‘\n’ 在返回呼叫者之前。如果它是 ‘’,则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。
将输出写入流时,如果 newline 为 None,则写入的任何 ‘\n’ 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 ‘’ 或 ‘\n’,则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 ‘\n’ 字符将被转换为给定的字符串。
例如:

f  = open('a3','wb+')
f.write(b'a\nb\rc\r\nd')
f.close()
chars = (None ,'','\n','\r\n')
for n1 in chars:
    f = open('a3',newline=n1)
    #print(f.read().encode())
    print(f.readlines())
    f.close()
['a\n', 'b\n', 'c\n', 'd']
['a\n', 'b\r', 'c\r\n', 'd']
['a\n', 'b\rc\r\n', 'd']
['a\nb\rc\r\n', 'd']

closefd:关闭文件描述符

关闭文件描述符,True表示关闭它,False会在文件关闭后保持这个描述符

f = open('a','r+',closefd=False)          # 报错,不能使用
f = open('a','r+')
f.fileno()  			 				  #文件描述符是多少
57

readline:行读取

for line in f: #大部分是这种,一行行读取一行行处理而不推荐readline
yield line

def a():
yield from open('test')

for i in a():
print(i)
readline:读一下显示一行

cat a3
aaaaa
d
f = open('a3','r+')
f.readline()      	 #读一下显示一行
'aaaaa\n'
f.readline()   		 #再读一下再显示一行
'd'

readlines:直接列表显示所有行 不推荐使用

f.readlines()    	 #readlines直接列表显示所有行    不推荐使用
['aaaaa\n', 'd']

for line in f: 		 #可以这么查看文件
    print(line)
for line in f: 		 #大部分是这种,一行行读取一行行处理
	yield line

writelines:将字符串列表写入文件

f = open('a3','w+')
lines = ['xiaoqiang','good','boy']   #想换行请自行添加'\n'
f.writelines(lines)
f.close()
cat a3
xiaoqianggoodboy

so

f = open('a3','w+')
lines = ['xiaoqiang','good','boy']
f.writelines('\n'.join(lines))
f.close()
cat a3
xiaoqiang
good
boy

readable(),writeable(),seekable(),f.closed:可读,可写,可seek,文件关闭了吗?

f = open('a3')
f.seekable(),f.readable(),f.writable(),f.closed
(True, True, False, False)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值