内容概要:
一、文件操作
二、字符编码解码
三、函数介绍
| 一、文件操作 |
文件操作流程:
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
基本操作:
1 #/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:W-D 4 f=open("test","r",encoding="utf-8")#打开文件,并告诉解释器以那种编码打开,编码不对会报错 5 data=f.read()#操作文件 6 print(data)#打印文件内容 7 f.close()#关闭文件
打开文件模式:
-
r ,只读模式【默认】
-
w,只写模式【不可读:不存在则创建;存在则清空内容;】
-
x, 只写模式【不可读:不存在则创建,存在则报错】
-
a, 追加模式【不可读;不存在则创建;存在则只追加内容;】
“+”表示同时读写某个文件,特别注意在操作文件过程中明白文件指针的位置,稍后我会举例子说明文件针的问题。
- r+,可读写文件【可读;可写;可追加】
- w+,写读
- a+,追加读
"b"表示处理二进制文件,意思是"b"类型打开的文件读的内容是字节类型(bytes),若写入文件也需要是字节类型,需要通过bytes进行转化。(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
- rb
- wb
- ab
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用),在python3中该模式已经废弃了,2.x版本中保留。
- rU
- r+U
示列一(r+模式):
下面着重说明文件指针和读写文件的关系,同时演示下以“b”模式打开的文件读写操作。
文件内容:
1 You were the shadow to my light 2 Did you feel us 3 Another Star 4 You fade away 5 Afraid our aim is out of sight 6 Wanna see us 7 Alive 8 Where are you now 9 Where are you now 10 Where are you now
示列代码:
1 #f.tell() 读取当前文件指针位置,单位为字符 2 #f.seek() 重新偏移指针位置,参数为整数 3 #f.readline()表示读取一行 4 #/usr/bin/env python 5 # -*- coding:utf-8 -*- 6 #Author:W-D 7 f=open("test","r+",encoding="utf-8") 8 print(f.tell())#打印开始的指针位置 9 data=f.readline()#读取第一行数据放在data里 10 print(len(data),data)#打印数据长度内容 11 print(f.tell())#打印当前指针位置 12 f.write("我")#写文件内容 13 print(f.tell())#打印指针位置 14 f.close()#关闭文件 15 16 结果: 17 0 18 28 were the shadow to my light 19 29 20 186 21 22 修改后的文件变为: 23 24 were the shadow to my light 25 Did you feel us 26 Another Star 27 You fade away 28 Afraid our aim is out of sight 29 Wanna see us 30 Alive 31 Where are you now 32 Where are you now 33 Where are you now我
结果分析:上述结果表明,以r+模式打开文件,一开始文件指针在0,但读取一部分内容后文件指针后移动,当使用write方法写文件时候,文件指针移到了末尾变成最后追加的方式,而并不是在读取文件时候的指针位置直接写。
示列二(以r+b):细心的小伙伴可以发现同样有r+模式,都是读取后再写内容,但是以“r+”模式指针移到了最后,追加写,而以“r+b”则指针不动,接着覆盖文件内容写。
1 #/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:W-D 4 f=open("test","r+b")#以b模式打开已经确定了编码不需要在写encoding 5 print(f.tell()) 6 data=f.readline() 7 print(type(data),data) 8 print(f.tell()) 9 f.write(bytes("我",encoding="utf-8"))#将字符串转化为bytes类型 10 print(f.tell()) 11 f.close() 12 结果: 13 0 14 <class 'bytes'> b'were the shadow to my light\r\n'#可以看见内容为bytes类型 15 29 16 32
附上处理文件时候使用的常用方法:
1 file.close() #关闭文件。关闭后文件不能再进行读写操作。 2 3 file.flush() #刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 4 5 file.fileno() #返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 6 7 file.isatty() #如果文件连接到一个终端设备返回 True,否则返回 False。 8 9 file.next() #返回文件下一行(迭代器)。 10 11 file.read([size]) #从文件读取指定的字节数,如果未给定或为负则读取所有。 12 13 file.readline([size]) #读取整行,包括 "\n" 字符。 14 15 file.readlines([sizehint]) #读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比sizhint较大, 因为需要填充缓冲区。 16 17 file.seek(offset[, whence]) #设置文件当前位置 18 19 file.tell() #返回文件当前位置。 20 21 file.truncate([size]) #截取文件,截取的字节通过size指定,默认为当前文件位置。 22 23 file.write(str) #将字符串写入文件,没有返回值。 24 25 file.writelines(list) #向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
文件内容循环:
在对文件的操作过程中,最多的就是读取并处理文件内容,当文件很大的时候,使用read方法一次性读取是非常不明智的,不仅处理慢,还耗内存,此时我们可以使用for循环处理。
示列:
1 #/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:W-D 4 f=open("test","r+",encoding="utf-8") 5 for line in f:#一行一行循环读取 6 print(line.strip())#打印 7 8 结果: 9 You were the shadow to my light 10 Did you feel us 11 Another Star 12 You fade away 13 Afraid our aim is out of sight 14 Wanna see us 15 Alive 16 Where are you now
tps:使用flush实现进度条效果
原理:
使用sys.stdout.write()方法向窗口输入字符(不换行),在使用flush强制刷新内存,打印在输出控制台上。
预备知识:
先说一下文本系统的控制符:
\r: 将光标移动到当前行的首位而不换行\n: 将光标移动到下一行,并不移动到首位\r\n: 将光标移动到下一行首位
#/usr/bin/env python # -*- coding:utf-8 -*- #Author:W-D import sys,time for i in range(1,101): num="="*i#设置每次打印=好的数量,数量一定要增加 sys.stdout.write("\r{}>%{}".format(num,i))#"\r"表示每次打印现将光标移动到最前面打印 sys.stdout.flush() time.sleep(0.5)
关于with
为避免我们打开了文件进行操作以后没有关闭,使用with打开文件会自动调用close()方法关闭文件,同时在python2.7以后with也提供了同时打开多个文件的上下文管理。
示列:修改文件
1 #/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:W-D 4 with open("test","r",encoding="utf-8") as f1,open("new.txt","w",encoding="utf-8") as f2: 5 for line in f1: 6 f2.write(line)#将f1(test)文件内容写入到f2(new.txt)中
| 二、字符编码解码 |
首先需要了解的知识:
1.在python2x中默认字符编码是ASCII, 而在python3里默认是utf-8
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),utf-8就是unicode
3.在pyhton3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
4.更多的编码知识请参考http://www.cnblogs.com/yuanchenqi/articles/5956943.html
日常疑难杂症状之windows编码问题:
以python2.7为例:
python2.7默认字符编码为ASCII,当我们在脚本文件中指定编码为utf-8,但是有时候还是会乱码,示列:
1 #/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:W-D 4 test="你好" 5 print(test)
结果:
原因分析:
虽然在代码中指定了编码格式,但是dos窗口编码是gbk,而我们用了utf-8,输出了乱码。ps:查看dos窗口编码方法:点击窗口-->右键-->属性,在当前页面栏。
如果这时候我们使用python3来执行当前的脚本,可以输出中文,因为python3的默认为unicode,unicode兼容gbk。
换个姿势让windows输出中文,这就是接下来要讲的编码解码(代码只适用于python2.x):
1 #/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:W-D 4 test="你好" 5 temp=test.decode(encoding="utf-8") 6 #解码,首先必须告诉解释器原来是什么编码 7 new_test=temp.encode("gbk")#编码,编码为GBK 8 print(new_test)#输出 9 结果: 10 你好
在python2中解码编码流程如下:
由于在python3中默认的字符编码改为了unicode,所以对于python3中的编码解码过程如下:
转码示列操作:
python2中:
1 #/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:W-D 4 test="我来了" 5 new_test=test.decode("utf-8").encode("gbk") 6 #decode必须制定当前编码,由于在脚本头中指定当前编码为utf-8,如果脚本头中没有指定,会采用系统默认编码。 7 print(new_test) 8 结果: 9 我来了