Python学习—基础篇之文件操作
文件操作
文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的。本篇博客中将主要对常见的文本格式文件和excel文件的相关操作进行介绍。
一、文本文件
1.1 文件操作流程
1、打开文件,获得文件句柄,并赋值给一个变量 ;
2、通过句柄对文件进行相关操作;
3、关闭文件
示例:
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2018/8/23 4 5 f = open('动物世界.txt','r',encoding='utf-8') 6 content = f.read() 7 print(content) 8 f.close() 9 10 #***************运行结果***************** 11 ''' 12 东打一下西戳一下 13 动物未必需要尖牙 14 示爱的方法有礼貌或是我管它 15 要将情人一口吞下 16 还要显得温文尔雅 17 螳螂委屈的展示旧伤疤 18 ...... 19 '''
open函数中,第一个参数为文件存储的位置+文件名(我在本地测试时文件与代码同级),第二个参数为文件的操作模式,第三个参数为操作的编码方式。
注意:文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要encoding='utf8'。文件如果是gbk保存的,则直接打开即可。
1.2 文件的操作模式
========= =============================================================== character meaning --------- --------------------------------------------------------------- 'r' open for reading (default) 'w' open for writing, truncating the file first 'x' create a new file and open it for writing 'a' open for writing, appending to the end of the file if it exists 'b' binary mode 't' text mode (default) '+' open a disk file for updating (reading and writing) 'u' universal newline mode (deprecated) ========= ===============================================================
示例:
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/1/21 4 5 # 只读文件 6 f = open('a.txt','r',encoding='utf-8') 7 f.read() 8 f.close() 9 10 # 只写文件 11 # 注意: 1.若无该文件,写文件操作时会自动创建;2.再次写入时会从开头写,将原来的内容覆盖 12 f = open('a.txt','w',encoding='utf-8') 13 f.write('helloll') 14 f.close() 15 16 # 以追加模式写入,会接着上一次的地方继续写 17 f = open('a.txt','a',encoding='utf-8') 18 f.write('123456879') 19 f.close() 20 21 # 以读写的模式操作文件 22 f = open('a.txt','r+',encoding='utf-8') 23 f.read(5) 24 f.write('233333') 25 f.read() 26 f.close() 27 28 # 以写读的模式操作文件 29 f = open('a.txt','w+') 30 print(f.read(5)) # 什么都没有,因为先格式化了文本 31 f.write('hello cdc') 32 print(f.read()) #还是read不到 33 f.seek(0) 34 print(f.read()) 35 36 # 以二进制方式读文件 37 f = open('a.txt','rb') 38 content = f.read() 39 print(type(content)) 40 f.close() 41 42 # 以二进制方式写文件 43 f = open('a.txt','wb') 44 f.write('hello alvin!'.encode()) 45 f.close()
1.3 文件操作的具体方法
文件内容的读取:
1 f.read() # 将文件内容全部读出来 2 f.read(5) # 读取五个字节的内容 3 f.readline() # 读取一行 4 f.readlines() # 将所有内容以换行符为准分割,形成一个列表对象
查看光标位置及光标操作:
1 #查看光标当前位置 2 f = open("a.txt","r",encoding="utf8") 3 print(f.tell()) 4 print(f.read(5)) 5 #一个中文默认为是三个字符 6 print(f.tell()) 7 f.seek(0) #调整光标位置 8 print(f.read(5))
1 f = open('a.txt', 'rb', ) 2 f.read(3) 3 f.seek(3) 4 print(f.read(3)) 5 6 f.seek(3,1) # 1为从当前位置,移动3个字节 7 print(f.read(3)) 8 9 f.seek(-4,2) # 2为从从文件末尾算,向前移动4个字节 10 print(f.read(3)) 11 f.close()
flush操作:将缓冲区的内容刷新到终端
1 import sys,time 2 for i in range(30): 3 sys.stdout.write("*") #在缓冲区内写内容 4 sys.stdout.flush() #将缓冲区内容刷新到终端显示 5 print("*",end='',flush=true) 6 time.sleep(0.2) 7 f = open("小重山","w",encoding="utf8") 8 f.truncate() #截断操作,只保留光标前的内容,不设置参数时默认光标位置为0
1.4 with方法
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
1 with open('a.txt','r',encoding='utf-8') as f: 2 f.readline()
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。with支持同时对多个文件的上下文进行管理,即:
1 with open('a.txt','r',encoding='utf-8') as f_read, open('b.txt','w',encoding='utf-8') as f_write: 2 f_read.readline() 3 f_write.write('hello')
1.5 踩坑啦!!!
对于文件的读取操作,本人在公司遇到过不少的麻烦。。。由于每个人使用的文本编辑器不同,并且不是所有人都能关注到语言格式的问题,所以往往存储的文件编码格式五花八门,等到这些数据到我手里需要处理的时候。。。我的内心 (▼ヘ▼#) (╯°д°)╯︵┻━┻
起初我打算自己写一套脚本来识别各种语言格式并统一转化成utf-8格式,无奈编码格式实在是太多种了,很难判断完全。后来我发现有一个非常巧妙的方法:
1 with open('filename','r',encoding='iso-8859-1') as f: 2 for line in f.readlines(): 3 content = bytes.decode(line.encode('utf-8')) 4 print(type(content))
以'iso-8859-1'的编码方式去读取文件,无论哪种编码格式的文件都可以以bytes类型的形式被读取出来,接着只要再将bytes转换成str,并以'utf-8'格式编码就大功告成了!
还有一种情况,在已经知道文件是以'utf-8'编码格式存储的情况下,以'utf-8'方式去读取还是报错:
1 with open('a.txt','r',encoding='utf-8') as f: 2 for i in f.readlines(): 3 print(i) 4 5 # 结果报错 6 #'\ufeffhello,world\n'
a.txt的文件编码格式为utf-8,但是读取的第一行前面会出现非法字符'\ufeff',后来发现是utf-8编码有无bom的原因造成的。bom,即byte order mark,就是字节序标记,具体原理感兴趣的童鞋可以谷歌了解一下!遇到这种情况只需要在读取文件的时候如下操作即可:
1 with open('a.txt', 'r', encoding='utf-8-sig') as f: 2 for i in f.readlines(): 3 print(i)
上一篇: 从零单排学Redis【铂金一】
下一篇: javaweb分页