文件操作
使用内置函数open来操作文件有三步:打开文件,操作文件,关闭文件。
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
读写形式
r: 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
f = open(‘/Users/michael/test.txt’, ‘r’)
rb: 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+: 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w: 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+: 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a: 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab: 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+: 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
文件的基本操作还有:
flush(), 即时刷新,可以在文件未关闭之前看到文件更新内容,不接参数。
readline(),读取当前指针处的一行内容。
readlines(n),读取当前指针处的n个字符,如果n不写,则默认全读完,如果n小于当前行的字符长度,则读取当前行内容,包括换行符\n,如果n大于当前行的字符长度,则一直到第从当前指针处的第n个字符所在的行,每一行的内容包括换行符作为一个列表的元素,最终返回该列表。
close(),关闭文件,文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
seek(n),调整指针位置
tell(),返回当前指针位置。
truncate(),截取当前指针处之前的字节内容。文件关闭时,就只有截取的内容了。
read(n),读取从当前指针处的多少个字符。返回的是字符串,read函数可以一次性读取文件全部内容,如果文件内容不大的话,适合使用这个函数一次性读取全部内容
write(),写入字符串或字节。
next(),逐行读取数据,和readline() 相似,唯一不同的是,f.readline() 读取到最后如果没有数据会返回空,而f.next() 没读取到数据则会报错
try…finally 保证无论是否出错都正确关闭文件
try:
f = open(‘/path/to/file’, ‘r’)
print(f.read())
finally:
if f:
f.close()
with 语句自动帮我们调用close() 方法 with打开文件会自动关闭文件
with open(‘/path/to/file’, ‘r’) as f:
print(f.read())
深浅拷贝
浅拷贝
浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用,只复制最外层的结构,除最外层其余的直接将其地址引用过来。
浅拷贝出来的对象就是外新内旧的对象,对象本身(id)和原始对象完全不同,但是子对象和原始对象的子对象是一样的。
可以通过列表自带的copy()或者copy模块的copy.copy()实现浅拷贝
对不可变类型,比如元组,字符串,不可以使用切片或者tuple方法浅拷贝,这两种都是对原对象的引用
深拷贝
全部数据/结构都进行复制,(除不可变类型)增大数据独立性 ,如果深拷贝中,只要发现复制数据中有一个不是不可变类型就重新创建。
深拷贝出来的对象就是完完全全的新对象,不管是对象本身(id),还是对象中包含的子对象,都和原始对象不一样。
相当于重新分配一块内存,创建了一个新的对象
一般以copy.deepcopy() 实现深拷贝