首页 > 代码库 > Python基础3 文件操作、字符编码与转码
Python基础3 文件操作、字符编码与转码
文件操作
对文件操作过程
打开文件,得到文件句柄赋值给变量
操作
关闭文件
打开文件的模式有:
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
#文件句柄
f = open(‘yesterday‘,‘r‘,encoding=‘utf-8‘)
#r模式为读模式
f = open(‘yesterday‘,‘r‘,encoding=‘utf-8‘)
#w模式为写,创建文件
f = open(‘yesterday2‘,‘w‘,encoding=‘utf-8‘)
f.write("我爱北京天安门,\n")
f.write("天安门上太阳升\n")
#a模式为追加,创建文件
f = open(‘yesterday2‘,‘a‘,encoding=‘utf-8‘)
f.write("我爱北京天安门,\n")
f.write("天安门上太阳升\")
#关闭文件
f.close()
#读前5行
f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘)
for i in range(5):
print (f.readline())
# 循环读每行
f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘)
for i in f.readlines():
print (i,)
# 读前9行
count = 0
f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘)
for line in f:
if count == 9:
print (‘------我是分割线-------‘)
count += 1
continue
print (line.strip())
count += 1
#seek和tall用法
f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘)
print (f.tell())
print (f.readline().strip())
print (f.readline().strip())
print (f.readline().strip())
print (f.tell())
f.seek(0)
print (f.readline().strip())
#强制刷新保存
f.flush()
#截断
f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘)
f.truncate(10)
#读写,r+,读和追加
f = open(‘yesterday2‘,‘r+‘,encoding=‘utf-8‘)
print (f.readline())
print (f.readline())
print (f.readline())
f.write(‘-----diao----\n‘)
print (f.readline())
#写读,w+,先创建一个文件
f = open(‘yesterday2‘,‘w+‘,encoding=‘utf-8‘)
f.write(‘-----diao----\n‘)
f.write(‘-----diao----\n‘)
f.write(‘-----diao----\n‘)
f.write(‘-----diao----\n‘)
print (f.tell())
f.seek(10)
print (f.readline())
f.write(‘should\n‘)
#追加读,a+
#读二进制文件
f = open(‘yesterday2‘,‘rb‘)
print (f.readline())
#写二进制文件
f = open(‘yesterday2‘,‘wb‘)
f.write(‘hello\n‘.encode(‘utf-8‘))
f.close()
#文件修改
f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘)
f_new = open(‘yesterday3‘,‘w‘,encoding=‘utf-8‘)
for line in f:
if ‘肆意的快乐‘ in line:
line = line.replace(‘肆意的快乐等我享受‘,‘肆意的快乐等xxx享受‘)
f_new.write(line)
f.close()
with语句
with open(‘file_name‘, r) as f:
...
# 在Python 2.7 后,with又支持同时对多个文件的上下文进行管理
with open(‘log1‘) as obj1, open(‘log2‘) as obj2:
...
字符编码与转码
需知:
在python2默认编码是ASCII, python3里默认是unicode
unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
python2
#-*-coding:utf-8-*-
import sys
print(sys.getdefaultencoding())
msg = "我爱北京天安门"
msg_gb2312 = msg.decode("utf-8").encode("gb2312")
gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")
print(msg)
print(msg_gb2312)
print(gb2312_to_gbk)
python3
#-*-coding:gb2312 -*- #这个也可以去掉
import sys
print(sys.getdefaultencoding())
msg = "我爱北京天安门"
#msg_gb2312 = msg.decode("utf-8").encode("gb2312")
msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔
gb2312_to_unicode = msg_gb2312.decode("gb2312")
gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")
print(msg)
print(msg_gb2312)
print(gb2312_to_unicode)
print(gb2312_to_utf8)
赋值及深浅拷贝
对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址
赋值
#赋值
#n1 n2指向同一内存地址,修改n1后n2依然指向之前的内存地址,n1内存地址变了
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
n2 = n1
print(id(n1))
print(id(n2))
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
print(id(n1))
print(id(n2))
print(n2)
浅拷贝
#复制列表,浅copy
#增加一个内存指针指向已经存在的内存,只影响第一层
names = [‘ZhangYang‘,‘ZhaoYi‘,‘ShaoYiFan‘,‘JiaChen‘,‘MengLingJun‘,‘LiuLin‘,[‘YangRui‘]]
names2 = names.copy()
print (names,names2)
import copy
#浅copy,3中方式
person = [‘name‘,[‘saving‘,100]]
‘‘‘
p1 = copy.copy(person)
p2 = person[:]
p3 = list(person)
‘‘‘
p1 = person[:]
p2 = person[:]
p1[0] = ‘tom‘
p2[0] = ‘jane‘
p1[1][1] = 50
print (p1)
print (p2)
深拷贝
import copy
#复制列表,深copy
#增加一个内存指针并申请一块新的内存
names2 = copy.deepcopy(names)
names[3] = ‘汤姆‘
names[-1][0] = ‘杰克‘
print (names)
print (names2)
Python基础3 文件操作、字符编码与转码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。