欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-14 11:02:51
文件操作 文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的。本篇博客中将主要对常见的文本格式文件和Excel文件的相关操作进行介绍。 一、文本文件 1.1 文件操作流程 1、打开文件,获得文件句柄,并赋值 ......

文件操作

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