博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python学习第十八天 --文件操作
阅读量:5172 次
发布时间:2019-06-13

本文共 3821 字,大约阅读时间需要 12 分钟。

这一章节主要讲解文件操作及其文件读取,缓存,文件指针。

文件操作

(1)文件打开:open(filepath,filemode)

filepath:要打开文件的路径

filemode:文件打开的方式

mode 说明 注意
'r' 只读方式打开 文件必须存在
'w' 只写方式打开

文件不存在创建文件

文件存在清空内容

'a' 追加方式打开 文件不存在创建文件
'r+'/'w+' 读写方式打开  
'a+' 追加和读写方式打开  

 

 

 

 

 

 

PS:'rb','wb','ab','rb+','wb+','ab+':二进制方式打开

>>> f = open('1.txt','w')>>> type(f)
>>> f.close()

(2)文件写操作:

write(str):将字符串写入文件

writelines(sequence_of_strings):写多行到文件

>>> f = open('1.txt','w+')>>> f.write("123456")>>> f.close()
try:    f = open('1.txt','w')    f.writelines(('12','23','45'))finally:    if f:        f.close()

(3)文件读操作:

read([size]):读取文件(读取size个字节,默认读取全部)

readline([size]):读取一行

readlines([size]):读取完文件,返回每一行所组成的列表

try:    f = open('1.txt','r')    value = f.read(3)    print valuefinally:    if f:        f.close()        122
try:    f = open('1.txt','r')    value = f.readline()    print valuefinally:    if f:        f.close()        122345

迭代读取

在实际文件读取中,因为OS缓存是有限的。IO只能缓存8192Byte。

>>> import io>>> io.DEFAULT_BUFFER_SIZE8192

如果文件超过8192Byte.直接通过readlines是不能完全读取出来了。

如果要完全读出来,使用迭代读取。

try:    f = open('1.txt','r')    iter_f = iter(f)    lines = 0    for line in iter_f:        lines+=1        print line    print linesfinally:    if f:        f.close()#1.txt有7行数据,使用迭代方式iter来将f对象迭代。        1223451223456122345671223456781223456789122345678901223456789017

 缓存机制

上一节讲到迭代读取,大家知道IO缓存最大为8192.对于IO操作来讲,缓存指的是内存缓存数据,执行之后,再从缓存写入到硬盘。

针对于IO文件write操作来讲,每次我们写入数据的时候,都是先写入缓存,执行close或者flush之后,才会真正的将缓存写入到硬盘。

所以,务必在操作完文件之后,必须最后执行f.close或者中途执行f.flush的动作。

文件指针

看下下面的例子:

try:    f = open('1.txt','r+')    dat = f.read(3)    print dat    dat = f.read(3)    print datfinally:    if f:        f.close()    122345

大家通过这个例子可以发现,read操作读取数据之后,再次调用读取操作,是不会从开始字节读取。这个就牵扯到文件指针的概念。

当f.read(3),文件指针就移动到第三个字节位置,当再次调用f.read(3),同样文件指针就移动到第六个字节位置。如果想要回滚会文件首部字节读取怎么办?

使用f.seek操作,先来看看seek函数的介绍:(偏移量超出文件长度就会报错)

f.seek(0, os.SEEK_SET) #移动文件指针到文件起始位置

f.seek(0, os.SEEK_END) #移动文件指针到文件末尾位置
f.seek(5, os.SEEK_CUR) #移动文件指针到当前位置的前5个字节上
f.seek(-5, os.SEEK_CUR)#移动文件指针到从文件末尾起前5个字节

try:    f = open('1.txt','r+')    dat = f.read(3)    location = f.tell()    print "location :%s" % location#标识当前文件指针的位置    print dat    dat = f.read(3)    location = f.tell()    print "location :%s" % location#标识当前文件指针的位置    print datfinally:    if f:        f.close()location :3 #标识当前文件指针的位置122location :6345
try:    f = open('1.txt','r+')    dat = f.read(3)    location = f.tell()    print "location :%s" % location    print dat    f.seek(os.SEEK_SET)#调用seek的动作    location = f.tell()    print "location :%s" % location        dat = f.read(3)    location = f.tell()    print "location :%s" % location    print datfinally:    if f:        f.close()        location :3122location :0location :3122

 通过上述例子可以看出,seek动作可以将文件指针重新回到文件首部。文件指针的位置可以通过f.tell()方法知道。seek其他参数讲解大家一一去尝试操作下。

文件编码格式 

try:    f = open('1.txt','r+')    f.write('qwer')    f.write(u'博客园')finally:    if f:        f.close()Traceback (most recent call last):  File "
", line 4, in
f.write(u'博客园')UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

大家都知道,有时候需要在文档里面写中文。上面的写法会直接报错。那么如何写入unicode编码的字符呢?

提供两种方法:

1、直接将unicode编码字符转换为utf8编码字符保存 :unicode.encode(u'博客园','utf-8')

try:    f = open('1.txt','r+')    f.write('qwer')    val = unicode.encode(u'博客园','utf-8')     f.write(val)finally:    if f:        f.close()>>> try:    f = open('1.txt','r+')    w = f.read()    print wfinally:    if f:        f.close()qwer博客园56

2.使用codecs模块直接创建指定编码格式的文件

>>> import codecs>>> help(codecs.open)Help on function open in module codecs:open(filename, mode='rb', encoding=None, errors='strict', buffering=1).....

那我们用了实例试试:

try:    f = codecs.open('5.txt','w+','utf-8')    f.write(u'博客园')    f.flush()finally:    if f:        f.close()

小结:这一章节主要讲解python的文件操作及其文件编码。

 

 

转载于:https://www.cnblogs.com/nx520zj/p/5777355.html

你可能感兴趣的文章
jquery.blockUI.2.31.js 弹出层项目介绍
查看>>
MongoDB应用上的坑
查看>>
【转】commons-lang.jar包简介
查看>>
【转】拉勾网 - 《2016互联网职场生态白皮书》
查看>>
java生成随机验证图片的实现
查看>>
javascript——创建对象模型1
查看>>
[asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
查看>>
Unity Behaviors for Interception
查看>>
Servlet & JSP - 转发与重定向的区别
查看>>
Ehcache(2.9.x) - API Developer Guide, Write-Through and Write-Behind Caches
查看>>
双相障碍
查看>>
通用权限管理系统基类中数据库的连接
查看>>
第二次实训作业
查看>>
计算2条线的相交点
查看>>
HDU 3639 Hawk-and-Chicken
查看>>
Flexbox 布局教程
查看>>
敏捷个人学习----为什么的力量
查看>>
软件开发的技术网站
查看>>
Cesium专栏-裁剪效果(基于3dtiles模型,附源码下载)
查看>>
Python自动化开发从浅入深-进阶(socketServer)
查看>>