python文件操作

文件读写

读写文件是最常见的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("输入有误请重试")


以上参考菜鸟教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值