| 
 | 
 
文件操作和pickle 
 
在Python中,推荐用上下文管理器(with-as)来打开文件,IO资源的管理更加安全,而且不用老惦记着给文件执行close()函数。还是举例子来说明,考虑有个文件name_age.txt,里面存储着名字和年龄的关系,格式如下: 
Tom,8 
Jerry,7 
Tyke,3 
... 
 
读取文件内容并全部显示: 
with open('name_age.txt', 'r') as f: # 打开文件,读取模式 
lines = f.readlines() # 一次读取所有行 
for line in lines: # 按行格式化并显示信息 
name, age = line.rstrip().split(',') 
print('{} is {} years old.'.format(name, age)) 
 
open()的第一个参数是文件名,第二个参数是模式。文件的模式一般有四种,读取(r),写入(w),追加(a)和读写(r+)。如果希望按照二进制数据读取,则将文件模式和b一起使用(wb, r+b…)。 
 
再考虑一个场景,要读取文件内容,并把年龄和名字的顺序交换存成新文件age_name.txt,这时可以同时打开两个文件: 
with open('name_age.txt', 'r') as fread, open('age_name.txt', 'w') as fwrite: 
line = fread.readline() 
while line: 
name, age = line.rstrip().split(',') 
fwrite.write('{},{}\n'.format(age, name)) 
line = fread.readline() 
 
有的时候我们进行文件操作是希望把对象进行序列化,那么可以考虑用pickle模块: 
import pickle 
 
lines = [ 
"I'm like a dog chasing cars.", 
"I wouldn't know what to do if I caught one...", 
"I'd just do things." 
] 
 
with open('lines.pkl', 'wb') as f: # 序列化并保存成文件 
pickle.dump(lines, f) 
 
with open('lines.pkl', 'rb') as f: # 从文件读取并反序列化 
lines_back = pickle.load(f) 
 
print(lines_back) # 和lines一样 
 
注意到,序列化的时候就得使用b模式了。Python2中有个效率更高的pickle叫cPickle,用法和pickle一样,在Python3中就只有一个pickle。 |   
 
 
 
 |