pythoncodec读写_python里文件读写操作

文件读写操作一种基本操作,但是里面也存在很多需要注意的问题,例如字符编码、内存缓冲、指针位置等等。如果忽视这些问题就会引起很多不必要的麻烦。简单来说,文件的读写分为几个过程:

打开文件,并定义操作文件的方式(读、写or读写)

通过句柄对文件进行操作

关闭文件

打开文件的模式通常有以下几种:

r,只读模式(默认)

w,只写模式(不可读,通常用次方式创造一个新文件)

a,追加模式(可读;不存在就会创建,存在会追加)

同时还存在,r+(指针位置),w+,a+,同时也存在rb,wb,ab代表处理二进制文件

文件的指针问题:

首先,打开一个文件,如下:

1 漂泊在无尽的夜2 遭受了无数的欺骗3 冠冕堂皇的借口它只是你的诡辩4 我心中有梦对你谈的利弊根本不屑5 因为6 前方的路还很远7 不能局限在一个焦点8 如果你眼光狭隘不懂蜕变,怎能看到我的心里面9 我渴望的不是稳定、数十年磨一剑10 我想要出去闯、迎接创新不断改变11 希望你们能发现这世界的真善美12 别再心机boy为了利益像个鬼13 就算现在你能将我击退14 待我卷土重来东山再起让你后悔

此文件编码是gbk模式的,所以打开文件时,要说明encoding='utf-8’,才能正确打开文件。

当我们对一个文件进行只读操作时,指针的起始位置都会在文件的起始位置,但是注意一个问题,当使用seek()切换指针位置的时候,指针偏移的量是代表的字节,所以,如果以rb的形式打开,就不会报错,但是如果以uft-8的形式打开,除非是seek()的字节是三的倍数,否则就会报错(因为utf8中一个汉字代表三个字节)。

with open('file_wr.text','r',encoding='utf-8') as f:

f.seek(3)print(f.readline())

result:

泊在无尽的夜

with open('file_wr.text','r',encoding='utf-8') as f:

f.seek(4)print(f.readline())

result:

Traceback (most recent call last):

File"D:/pytwice/day1/homework_for_day1/文件读写.py", line 5, in

print(f.readline())

File"C:\Users\z00428606\AppData\Local\Programs\Python\Python36\lib\codecs.py", line 321, indecode

(result, consumed)=self._buffer_decode(data, self.errors, final)

UnicodeDecodeError:'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte

当我们对文件进行写操作的时候,无论如何偏移指针,就相当于对一个空文件从零开始进行写操作。

当我们对文件进行r+操作的时候,可以认为有两个指针,一个是读指针,一个是写指针,读指针和只读模式一样,写指针则是在文件的末尾进行追加操作。

对于w+......和w感觉没什么区别,读也读不出来......忘记他吧!

还有一个很重要的事情:flush。

我们进行文件读写操作时,写东西进去的时候,数据首先会进入内存缓冲区,然后再存到硬盘上,但是,存入内存缓冲区的文件不会一收到数据就发给硬盘,这样效率太低了,浪费资源。所以,一般情况下,都是等待内存缓冲区存好足够多的数据的时候,才会统一存到硬盘上面。这种情况下,就很大程度的节约了资源。但是,在某些特殊场景下,这种方式存在重大的安全隐患,比如突然断电、死机等等意外情况都会导致内存缓冲区的数据清空,在一些特殊的行业(金融、银行等)就会存在很大的风险(你刚存完钱的时候ATM机后台断电了,你找妈妈哭去!)。所以,有一种方法可以实现,及时刷新,发一条数据,内存收到,就会立马存到硬盘上。就是flush功能。

#Author:Zhang Zhao

with open('file_wr.text','w',encoding='utf-8') as f:

f.write('zz')

f.flush()

看看就好!

忘记一个!!tell功能,很简单,就是显示指针的位置:

#Author:Zhang Zhao

with open('file_wr.text','r+',encoding='utf-8') as f:

f.seek(6)print(f.tell())

result:6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值