一、编码的进阶
前面我们知道ASCII码1个字符占1个字节空间,UIcode1个字符占4个字节空间,gbk1个字符占4个字节空间,utf-8至少用1个字节表示一个字符,这就导致不同编码之间不能互相识别。网络传输或磁盘存储数据所用的编码方式都是二进制,而我们写入的数据一般都是str的形式,因而我们在传输之前需要将Unicode编码(Unicode不能使用编码本去编译)转化为非Unicode编码。
二、文件操作的初识
对一个文件进行操作时,,我们需要知道:
- 文件的路径:path
- 文件的编码方式:utf-8,gbk等等
- 具体的操作:读,写,读写,写读,等等
进行文件操作时,常见的问题有:
- 路径问题:如"D:\0美女护士教师主妇联系方式.txt",这里的“\”原本是路径标识符,后面有数字计算机会识别为某些特殊词;可以在路径前加“r”告诉计算机这是一个路径,或者使用“\\”代替“\”。
- 编码的问题:如“UnicodeDecodeError……”,这是因为编码用错,我们使用的编码要与存储文件时的编码一致。
- 后缀名:有的电脑默认隐藏后缀名,需写明后缀名。
操作文件的流程:
- 打开文件,产生一个文件句柄.
- 对文件句柄进行相应的操作.
- 关闭文件句柄.
三、文件的读
文件的读有‘r’(只读,字符为单位),‘r+’(先读后写),‘rb’(只读二进制,字节为单位),‘r+b’(先读后写二进制)4种模式,每种模式又包含5种不同方式。
读的方式:
- read():全部读取
- read(n):指定读取的长度
- readline():按行读取
- readlines():返回一个list,列表里的每一个元素都是原文件的一行
- for循环:每行只会读取一行内容,内存占用小,推荐。
f1 = open('r模式',encoding='utf-8',mode='r+') f1.write('666') print(f1.read()) f1.close()
上面是用r+的读操作的代码示例(py文件与目标文件的路径不同需写全)
四、文件的写
文件的写有‘w’(只写),‘w+’(先写后读),‘wb’(只写二进制),‘w+b’(先写后读二进制)4种模式,每种模式又包含5种不同方式。写操作时没有文件会创建文件,写入内容,有文件会清空后再写入。
f1 = open('毕业照.jpg',mode='rb') content = f1.read() f1.close() f2 = open('毕业照1.jpg',mode='wb') f2.write(content) f2.close()
上面的代码是利用wb操作将图片转成字节码再根据字节码生成一个新的图片,同样的,py文件与目标文件的路径不同需写全。
五、文件的追加
文件的追加有‘a’(追加),‘a+’(追加可写读),‘ab’(追加二进制),‘a+b’(可写读二进制)4种模式。
六、其他操作方法
fileno():文件描述符,一般用不到
flush():强制保存
readable():判断文件是否可读
writeable():判断文件是否可写
seek():按照字节调整光标位置
tell():获取光标位置
truncate():以字节为单位从文件的开头截取文件
最常用的:read seek tell flush readable writeable
打开文件的另一种方式是使用with open,这样在大多数情况下就不需要去关闭文件,一个with语句可以操作多个句柄。但with open自动关闭有一定的时间延迟,当第二个with open开始时第一个未关闭时会有一个IOerror的报错,这时就需要我们手动关闭文件。
七、文件的改
文件的的更改一般分5步:
- 以读的模式打开原文件
- 以写的模式创建一个新文件
- 将原文件内容读取出来,按照要求改成新内容,写入新文件
- 删除原文件
- 将新文件重命名为原文件
代码如下:
import os with open('alex自述', encoding='utf-8')as f1, \ open('alex自述.bak', encoding='utf-8', mode='w')as f2: for old_line in f1: new_line = old_line.replace('alex', 'SB') f2.write(new_line) os.remove('alex自述') os.rename('alex自述.bak', 'alex自述')
八、深浅copy
浅copy:
无论在同一代码块下还是不同代码块下:
创建了一个新的外壳(如列表),列表中的所有元素都是共用的。全切属于浅copy。
深copy:
无论在同一代码块下还是不同代码块下:
不仅创建了一个新的外壳,外壳里的可变数据类型也创建了一份,但是不可变类型数据还是共用一份。