文件读写
读写文件是最常见的IO操作。python内置了读写文件的函数。
读文件
要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:
#第一步(以只读模式)打开文件
f = open('/Users/michael/test.txt', 'r')
#第二步:读取文件内容标示符'r'表示读,这样,我们就成功地打开了一个文件。
#如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:
print(f.read())
#第三步:关闭文件。调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
f.close()
常见的文件打开模式有:只读、只写、可读可写、只追加。如下图:
f.readline()
f.readline() 会从文件中读取单独的一行。换行符为 ‘\n’。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
# 打开一个文件
f = open("/tmp/foo.txt", "r")
str = f.readline()
print(str)
# 关闭打开的文件
f.close()
f.readlines()
f.readlines() 将返回该文件中包含的所有行。
如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
# 打开一个文件
f = open("/tmp/foo.txt", "r")
str = f.readlines()
print(str)
# 关闭打开的文件
f.close()
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:
try:
f = open('/Users/michael/test.txt', 'r')
print(f.read())
finally:
if f:
f.close()
另一种方式是迭代一个文件对象然后读取每行:
# 打开一个文件
f = open("/tmp/foo.txt", "r")
for line in f:
print(line, end='')
# 关闭打开的文件
f.close()
写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件
f = open('/Users/michael/test.txt', 'w')
f.write('Hello, world!')
f.close()
seek()函数
如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数。
from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
seek(x,1) : 表示从当前位置往后移动x个字符
seek(-x,2):表示从文件的结尾往前移动x个字符
from_what 值为默认为0,即文件开头。下面给出一个完整的例子:
>>> f = open('/tmp/foo.txt', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # 移动到文件的第六个字节
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # 移动到文件的倒数第三字节
13
>>> f.read(1)
b'd'
pickle 模块
pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,
pickle序列化后的数据,可读性差,人一般无法识别。
Pickle模块中最常用的函数为:
pickle.dump(obj, file, [,protocol])
函数的功能:将obj对象序列化存入已经打开的file中
参数讲解:
obj: 想要序列化的obj对象。
file: 文件名称。
protocol:序列化使用的协议。如果该项省略,则默认为0。如果 为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。
import pickle
f=open("lianxi.txt","wb")
dict1={"小李":18,"小红":"20"}
pickle.dump(dict1,f)
f.close()
pickle.load(file)
函数的功能:将file中的对象序列化读出。
import pickle
f=open("lianxi.txt","rb")
a=pickle.load(f)
print(a)
f.close()
通过 pickle 序列化实现一个简单联系人信息管理:
import pickle
import os
datafile="person.txt"
line="==============================="
message='''
================================
欢迎来到书签管理系统:
1.显示列表
2.添加人名
3.编辑联系人
4.删除联系人
5.搜索联系人
6.显示菜单
0.退出
=================================
'''
class Person():
def __init__(self,name,number):
self.name=name
self.number=number
print(message)
#读取数据
def get_data(filename=datafile):
if os.path.exists(filename) and os.path.getsize(filename):
with open(filename,"rb") as f:
return pickle.load(f)
return None
#写入数据
def set_data(name,number,filename=datafile):
personlist={} if get_data()==None else get_data()
with open(filename,"wb") as f:
personlist[name]=Person(name,number)
pickle.dump(personlist,f)
#保存字典格式的数据到文件
def save_data(dictperson,filename=datafile):
with open(filename,"wb") as f:
pickle.dump(dictperson,f)
#显示所有联系人
def show_all():
personlist=get_data()
if personlist:
for v in personlist.values():
print(v.name,v.number)
print(line)
else:
print("列表中没有人物,请添加人物")
print(line)
#添加联系人
def add_person(name,number):
set_data(name,number)
print("添加人物成功")
print(line)
#编辑联系人
def edit_person(name,number):
personlist=get_data()
if personlist:
personlist[name]=Person(name,number)
print("修改成功")
print(line)
#删除联系人
def del_person(name):
personlist=get_data()
if personlist:
if name in personlist:
del personlist[name]
save_data(personlist)
print("删除成功")
else:
print(name,"没有在列表里")
print(line)
#搜索联系人
def search_person(name):
personlist=get_data()
if personlist:
if name in personlist.keys():
print(personlist.get(name).name,personlist.get(name).number)
else:
print("没有找到这个人物")
print(line)
while True:
num=input(">>")
if num=="1":
print("显示所有列表:")
show_all()
elif num=="2":
print("添加人物名:")
name=input("输入名字>>")
number=input("输入数字>>")
add_person(name,number)
elif num=="3":
print("请输入要编辑的人物名:")
name = input("输入名字>>")
number = input("输入数字>>")
edit_person(name,number)
elif num=="4":
print("请输入要删除的人物")
name = input("输入名字>>")
del_person(name)
elif num=="5":
print("请输入要搜索的人物名")
name=input("人物名>>")
search_person(name)
elif num=="6":
print(message)
elif num=="0":
break
else:
print("输入有误请重试")
以上参考菜鸟教程