一、编码的进阶

前面我们知道ASCII码1个字符占1个字节空间,UIcode1个字符占4个字节空间,gbk1个字符占4个字节空间,utf-8至少用1个字节表示一个字符,这就导致不同编码之间不能互相识别。网络传输或磁盘存储数据所用的编码方式都是二进制,而我们写入的数据一般都是str的形式,因而我们在传输之前需要将Unicode编码(Unicode不能使用编码本去编译)转化为非Unicode编码。

 

二、文件操作的初识

对一个文件进行操作时,,我们需要知道:

  1. 文件的路径:path
  2. 文件的编码方式:utf-8,gbk等等
  3. 具体的操作:读,写,读写,写读,等等

进行文件操作时,常见的问题有:

  1. 路径问题:如"D:\0美女护士教师主妇联系方式.txt",这里的“\”原本是路径标识符,后面有数字计算机会识别为某些特殊词;可以在路径前加“r”告诉计算机这是一个路径,或者使用“\\”代替“\”。
  2. 编码的问题:如“UnicodeDecodeError……”,这是因为编码用错,我们使用的编码要与存储文件时的编码一致。
  3. 后缀名:有的电脑默认隐藏后缀名,需写明后缀名。

操作文件的流程:

  1. 打开文件,产生一个文件句柄.
  2. 对文件句柄进行相应的操作.
  3. 关闭文件句柄.

三、文件的读

文件的读有‘r’(只读,字符为单位),‘r+’(先读后写),‘rb’(只读二进制,字节为单位),‘r+b’(先读后写二进制)4种模式,每种模式又包含5种不同方式。

读的方式:

  1. read():全部读取
  2. read(n):指定读取的长度
  3. readline():按行读取
  4. readlines():返回一个list,列表里的每一个元素都是原文件的一行
  5. for循环:每行只会读取一行内容,内存占用小,推荐。
f1 = open('r模式',encoding='utf-8',mode='r+')
f1.write('666')
print(f1.read())
f1.close()
View Code

上面是用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()
View Code

上面的代码是利用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步:

  1. 以读的模式打开原文件
  2. 以写的模式创建一个新文件
  3. 将原文件内容读取出来,按照要求改成新内容,写入新文件
  4. 删除原文件
  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自述')
View Code

 

八、深浅copy

浅copy:

  无论在同一代码块下还是不同代码块下:

  创建了一个新的外壳(如列表),列表中的所有元素都是共用的。全切属于浅copy。

深copy:

  无论在同一代码块下还是不同代码块下:

  不仅创建了一个新的外壳,外壳里的可变数据类型也创建了一份,但是不可变类型数据还是共用一份。