首页 > 代码库 > 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 文件操作、字符编码与转码