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对象常用的函数:

序号方法描述
1file.close()关闭文件。关闭后文件不能再进行读写操作。
2file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
3file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
4file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。
5file.next()返回文件的下一行
6file.read([size])从文件读取指定的字节数,如果未给定或为负则读取所有。
7file.readline([size])读取整行,包括 "\n" 字符。
8file.seek()设置文件的当前位置
9file.tell()返回文件的当前位置
10file.truncate([size])从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
11file.write(str)将字符串写入文件,没有返回值
12file.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

[root@web01 ~]# 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

Python入门篇(五)之文件操作和字符编码

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)

执行结果:
[root@web01 ~]# python encode.py 
ascii
ţº --->乱码

此处将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'
我爱北京天安门

转载于:https://blog.51cto.com/jinlong/2083155

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值