Python入门篇之文件操作和字符编码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python入门篇之文件操作和字符编码相关的知识,希望对你有一定的参考价值。
1、文件操作
1、文件操作流程:
打开文件,得到文件句柄并赋值给一个变量===> file = open("yesterday",encoding="utf-8")
通过句柄对文件进行操作
关闭文件 ==> file.close()
1.2、打开文件的模式
r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】
w+,写读----->没啥卵用
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
rb--->二进制文件读取,二进制文件必须使用二进制模式打开
wb
ab
不同模式使用练习:
书写一个文件,内容如下:
我爱北京天安门
北京天安门上太阳升
data = open("yestday",encoding="utf-8").read() --->全部读取,默认为r(只读模式)
print(data)
执行结果:
我爱北京天安门
北京天安门上太阳升
*******************************************************************************************
当模式更改为只写模式时,会提示报错,不可读,并且会将yestday文件内容清空
data = open("yestday",‘w‘,encoding="utf-8").read()
print(data)
执行结果:
io.UnsupportedOperation: not readable
*******************************************************************************************
data = open("yestday",‘a‘,encoding="utf-8")
data.write("\nwelcome")
执行结果:无返回值,可以查看yestday文件是否在尾部增加了welcome的字符
*******************************************************************************************
yestday文件内容:
You Are My Baby!
Come on!!!
Come on!!!
Come on!!!
welcome
data = open("yestday",‘r+‘,enconding="utf-8")
print(data.readline())
print(data.readline())
data.write("\nBeiJing")
执行结果:
You Are My Baby!
Come on!!!
查看yestday文件内容:
You Are My Baby!
Come on!!!
Come on!!!
Come on!!!
welcome
BeiJing
★★r+读写模式,只能在尾部追加,无法在文件内部进行插入,比如上面先读取了2行,再写入BeiJing,查看文件的变化是在尾部增加了该字符串。
1.3、file对象常用函数
file对象使用open函数来创建,以下为file对象常用的函数:
序号 | 方法 | 描述 |
---|---|---|
1 | file.close() | 关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty() | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | file.next() | 返回文件的下一行 |
6 | file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | file.readline([size]) | 读取整行,包括 "\n" 字符。 |
8 | file.seek() | 设置文件的当前位置 |
9 | file.tell() | 返回文件的当前位置 |
10 | file.truncate([size]) | 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
11 | file.write(str) | 将字符串写入文件,没有返回值 |
12 | file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
进度条练习:---->使用flush刷新缓冲区
import sys,time
for i in range(10):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)
执行结果:
##########
文件的修改练习:---->通过将修改的内容保存到一个新的文件当中
文件内容如下:
我爱北京天安门
天安门上太阳升
张杰
林俊杰
周杰伦
file = open("yestday","r",encoding="utf-8")
filenew = open("yestdaynew",‘w‘,encoding="utf-8")
for line in file:
if "张杰" in line:
line = line.replace("张杰","谢娜")
filenew.write(line)
file.close()
filenew.close()
执行结果:
生成了yestdaynew文件,内容如下:
我爱北京天安门
天安门上太阳升
谢娜
林俊杰
周杰伦
1.4、with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:with open(‘log‘,‘r‘) as f:
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:with open(‘log1‘) as obj1, open(‘log2‘) as obj2:
with open("yestday",‘r‘,encoding="utf-8") as file:
for line in file:
print(line)
执行结果:
我爱北京天安门
天安门上太阳升
张杰
林俊杰
周杰伦
with open("yestday",‘r‘,encoding="utf-8") as file , open("yestday",‘r‘,encoding="utf-8") as file2:
for line in file2:
print(line)
执行结果:
我爱北京天安门
天安门上太阳升
张杰
林俊杰
周杰伦
2、字符编码和转码
详细文章:
python编码终极版
2.1需知
1.在python2默认编码是ASCII, python3里默认是unicode
[[email protected] ~]# python
Python 2.7.5 (default, Aug 4 2017, 00:39:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.getdefaultencoding())
ascii
C:\Users\Administrator>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.getdefaultencoding())
utf-8
>>>
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), 所以 utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
4.Unicode与utf8的关系:
一言以蔽之:Unicode是内存编码表示方案(是规范),而UTF是如何保存和传输Unicode的方案(是实现)这也是UTF与Unicode的区别。
in python 2.x
#author = KIM
#-*-coding:utf-8-*- -->申明编码的方式为utf-8
import sys
print(sys.getdefaultencoding()) -->python 2.x中默认的编码是ascii
msg = "你好"
msg_to_gbk = msg.decode("utf-8").encode("gbk")
print(msg_to_gbk)
执行结果:
[[email protected] ~]# python encode.py
ascii
?o --->乱码
此处将utf-8编码转为gbk的编码过程:msg解码(decode)为unicode,再编码(encode)为gbk。而默认的的编码格式为utf-8,gbk格式明文显示会出现乱码。
in python 3.x
import sys
print(sys.getdefaultencoding())
msg = "我爱北京天安门"
msg_gbk = msg.encode("gbk") -->默认就是unicode,不需要decode
msg_utf8 = msg.encode("utf-8")
msg_unicode = msg.encode("gbk").decode("gbk")
print(msg_gbk)
print(msg_utf8 )
print(msg_unicode)
执行结果:
utf-8
b‘\xce\xd2\xb0\xae\xb1\xb1\xbe\xa9\xcc\xec\xb0\xb2\xc3\xc5‘
b‘\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8‘
我爱北京天安门
以上是关于Python入门篇之文件操作和字符编码的主要内容,如果未能解决你的问题,请参考以下文章