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)

 二、Excel文件

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

To be continue......

craw_pics
posted @ 2019-01-21 23:24  cdcx  阅读(409)  评论(0编辑  收藏  举报