Python学习—基础篇之文件操作

时间:2023-03-09 00:28:38
Python学习—基础篇之文件操作

文件操作

文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的。本篇博客中将主要对常见的文本格式文件和Excel文件的相关操作进行介绍。

一、文本文件

1.1 文件操作流程

  1、打开文件,获得文件句柄,并赋值给一个变量 ;

  2、通过句柄对文件进行相关操作;

  3、关闭文件

示例:

 # -*- coding:utf-8 -*-
# author: cdc
# date: 2018/8/23 f = open('动物世界.txt','r',encoding='utf-8')
content = f.read()
print(content)
f.close() #***************运行结果*****************
'''
东打一下西戳一下
动物未必需要尖牙
示爱的方法有礼貌或是我管它
要将情人一口吞下
还要显得温文尔雅
螳螂委屈的展示旧伤疤
......
'''

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)
========= ===============================================================

示例:

 # -*- coding:utf-8 -*-
# author: cdc
# date: 2019/1/21 # 只读文件
f = open('a.txt','r',encoding='utf-8')
f.read()
f.close() # 只写文件
# 注意: 1.若无该文件,写文件操作时会自动创建;2.再次写入时会从开头写,将原来的内容覆盖
f = open('a.txt','w',encoding='utf-8')
f.write('helloll')
f.close() # 以追加模式写入,会接着上一次的地方继续写
f = open('a.txt','a',encoding='utf-8')
f.write('')
f.close() # 以读写的模式操作文件
f = open('a.txt','r+',encoding='utf-8')
f.read(5)
f.write('')
f.read()
f.close() # 以写读的模式操作文件
f = open('a.txt','w+')
print(f.read(5)) # 什么都没有,因为先格式化了文本
f.write('hello cdc')
print(f.read()) #还是read不到
f.seek(0)
print(f.read()) # 以二进制方式读文件
f = open('a.txt','rb')
content = f.read()
print(type(content))
f.close() # 以二进制方式写文件
f = open('a.txt','wb')
f.write('hello alvin!'.encode())
f.close()

1.3 文件操作的具体方法

文件内容的读取:

 f.read()               # 将文件内容全部读出来
f.read(5) # 读取五个字节的内容
f.readline() # 读取一行
f.readlines() # 将所有内容以换行符为准分割,形成一个列表对象

查看光标位置及光标操作:

 #查看光标当前位置
f = open("a.txt","r",encoding="utf8")
print(f.tell())
print(f.read(5))
#一个中文默认为是三个字符
print(f.tell())
f.seek(0) #调整光标位置
print(f.read(5))
 f = open('a.txt', 'rb', )
f.read(3)
f.seek(3)
print(f.read(3)) f.seek(3,1) # 1为从当前位置,移动3个字节
print(f.read(3)) f.seek(-4,2) # 2为从从文件末尾算,向前移动4个字节
print(f.read(3))
f.close()

flush操作:将缓冲区的内容刷新到终端

 import sys,time
for i in range(30):
sys.stdout.write("*") #在缓冲区内写内容
sys.stdout.flush() #将缓冲区内容刷新到终端显示
print("*",end='',flush=True)
time.sleep(0.2)
f = open("小重山","w",encoding="utf8")
f.truncate() #截断操作,只保留光标前的内容,不设置参数时默认光标位置为0

1.4 with方法

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

 with open('a.txt','r',encoding='utf-8') as f:
f.readline()

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。with支持同时对多个文件的上下文进行管理,即:

 with open('a.txt','r',encoding='utf-8') as f_read, open('b.txt','w',encoding='utf-8') as f_write:
f_read.readline()
f_write.write('hello')

1.5  踩坑啦!!!

对于文件的读取操作,本人在公司遇到过不少的麻烦。。。由于每个人使用的文本编辑器不同,并且不是所有人都能关注到语言格式的问题,所以往往存储的文件编码格式五花八门,等到这些数据到我手里需要处理的时候。。。我的内心    (▼ヘ▼#)     (╯°Д°)╯︵┻━┻

起初我打算自己写一套脚本来识别各种语言格式并统一转化成utf-8格式,无奈编码格式实在是太多种了,很难判断完全。后来我发现有一个非常巧妙的方法:

 with open('filename','r',encoding='iso-8859-1') as f:
for line in f.readlines():
content = bytes.decode(line.encode('utf-8'))
print(type(content))

以'iso-8859-1'的编码方式去读取文件,无论哪种编码格式的文件都可以以bytes类型的形式被读取出来,接着只要再将bytes转换成str,并以'utf-8'格式编码就大功告成了!

还有一种情况,在已经知道文件是以'utf-8'编码格式存储的情况下,以'utf-8'方式去读取还是报错:

 with open('a.txt','r',encoding='utf-8') as f:
for i in f.readlines():
print(i) # 结果报错
#'\ufeffHello,World\n'

a.txt的文件编码格式为utf-8,但是读取的第一行前面会出现非法字符'\ufeff',后来发现是utf-8编码有无BOM的原因造成的。BOM,即Byte Order Mark,就是字节序标记,具体原理感兴趣的童鞋可以谷歌了解一下!遇到这种情况只需要在读取文件的时候如下操作即可:

 with open('a.txt', 'r', encoding='utf-8-sig') as f:
for i in f.readlines():
print(i)

二、Excel文件

python中操作excel文件的第三方库有很多,在这边主要介绍xlrd、xlwt、openpyxl三种常用的库。

To be continue......


craw_pics