Python的文件操作

本章主要介绍文件的创建与读写,以及对象的序列化方式。学习完本章的内容,可以实现将程序的运行结果进行持久化存储。

一、文件的打开和关闭

用户与程序的交互都是使用input函数进行输入,使用print函数进行输出。而print函数是将数据输出到屏幕上,如果要加数据持久化存储,文件是有效的方式之一。

1.打开与关闭

在Python中,读写文件首先需要使用open方法获取一个文件对象,该文件对象提供了操作文件资源的接口。根据文件模式创建的文件对象,可以对磁盘文件进行访问,也可以对标准输入、标准输出、套接字、管道等进行访问。文件对象也被称为文件类对象或者流。
Python中的文件对象类型分别是原始二进制文件、缓冲二进制文件及文本文件。它们的接口定义均在io模块中。创建文件对象的规范方式是使用open函数。
open函数具有多个参数,最常用的参数如下。
filename:一个存在的文件路径,用字符串表示。
mode:文件打开模式,用字符串表示。mode可以是" r " " w " " a " " r+ “等。mode参数是可选的,默认值为” r “。
encoding:用于指定编码格式,用字符串表示。encoding参数可以是” gbk " "gb2312 " " utf-8 "等。

通常,文件是以文本模式打开的,这意味着从文件中读取或写入字符串时,都会以指定的编码方式进行编码。如果未指定编码格式,则默认值与平台相关。在mode中追加的" b "则以二进制模式打开文件,以字节对象的形式进行读写。二进制模式可以用于所以不包含文本的文件,如图片、视音频、网络流等。
在打开文件时,最好使用with关键字。即使在某个时刻引发了异常,当with代码块结束后也会正确关闭文件对象。而且with关键字比try-finally代码块要简短得多,如以下代码

with open('文件名')as f:
read_data=f.read()

如果没有使用with关键字,那么就需要调用f.close函数来关闭文件对象,并立即释放它使用的所有系统资源。如果没有显式地关闭文件,Python的垃圾回收器最终将销毁该对象并关闭打开的文件,但这个文件可能会保持打开状态一段时间。不同类型的Python解释器会在不同的时间进行清理,因此这个文件打开状态的时间就不可控了。

2.文件打开模式

在上一小节提到,文件打开模式由参数mode指定,参数mode是一个可选字符串,用于指定打开文件的模式,默认值是" r “,这意味着它以文本模式打开并读取。其他常见模式包括写入” w “;排他性创建” x “;追加写” a “。在一些Unix系统上,无论当前的文件指针在什么位置,所以写入都会追加到文件末尾。
可用的模式如下表所示,这些模式既可以单独使用,也可以同时使用,如” wb+ "表示以二进制读写模式打开。

序号字符描述
1’ r ’读取(默认)
2’ w ’写入,会覆盖原有文件
3’ x ’排他性创建,如果文件已存在则失败
4’ a ’写入。如果文件存在则在末尾追加
5’ b ’二进制模式
6’ t ’文本模式(默认)
7’ + ’更新磁盘文件(读取并写入)

二、文件的基本操作

文件对象的基本操作包括创建文件,写入内容、读取文件、将文件进行重命名、删除文件。本小节将详细演示这些操作。

1.文件的创建

如下,打开文件,指定模式为" w " " w+ " " a " " a+ "时,可以创建文件。

path=r"D:\file\a.txt"
with open(path,"w")as f:
    pass

path=r"D:\file\b.txt"
with open(path,"w+")as f:
    pass

path=r"D:\file\c.txt"
with open(path,"a")as f:
    pass

path=r"D:\file\d.txt"
with open(path,"a+")as f:
    pass

执行结果如下,在D:\file目录下创建的文件
在这里插入图片描述

2.文件的写入

文件的写入既可以在没有该文件的情况下进行,即在创建文件时进行写入,也可以是对现有文件追加内容,如下。在第3行,通过" w “创建文件a.txt,并写入内容。在第6行,通过” w+ “创建文件a.txt,并写入内容,这时会覆盖第3行创建的文件。在第10行通过” a “创建文件c.txt。在第13行通过” a+ “创建文件c.txt。注意,” a "模式的特性是如果文件已经存在,则会追加内容。

path =r"D:\file\a.txt"
content1="hello world"
with open(path,"w")as f:
    f.write(content1)

content2=["hello","python"]
with open(path,"w+")as f:
    f.writelines(content2)

path=r"D:\file\c.txt"
with open(path,"a")as f:
    f.write(content1+"\n")

with open(path,"a+")as f:
    f.writelines(content2)

执行结果如下,可以看到写入文件后的内容
在这里插入图片描述

3.文件的读取

读取文件使用" r "模式,如下所示,在第3行和第8行,调用read方法读取文件所有内容

path=r"D:\file\a.txt"
with open(path,"r")as f:
    content=f.read()
    print("a.txt文件内容是:",content)

path=r"D:\file\c.txt"
with open(path,"r")as f:
    content=f.read()
print("c.txt文件内容是:",content)

执行结果如下

a.txt文件内容是: hellopython
c.txt文件内容是: hello world
hellopython
4.文件重命名

重命名文件不能使用文件对象,而是使用os模块下的rename函数,如下

import os

file=r"D:\file\a.txt"
file1=r"D:\file\a1.txt"
os.rename(file,file1)

file=r"D:\file\c.txt"
file1=r"D:\file\c1.txt"
os.rename(file,file1)

执行结果如下,显示了D:\file目录下的新文件
在这里插入图片描述

5.文件的删除

删除文件需要使用os模块下的remove方法,如下所示

import os

file=r"D:\file\a1.txt"
os.remove(file)

file=r"D:\file\c1.txt"
os.remove(file)

执行结果如下,可以看到在D:\file目录下已经没有文件了
在这里插入图片描述

三、文件内容的迭代

了解如何创建文件对象及利用os模块来管理文件之后,还需要知道如何对文件内容进行操作。本小节将详细介绍几种文件内容操作方式。

1.按字节读取

按字节操作是指打开文件后,通过文件对象的read方法,按字节数循环读取文件内容。如下所示,在第3行,设置while True表示不断读取文件内容。第4行,f.read(12)表示每次读取12个字节内容返回给content对象。读到文件末尾将返回空字符串,因此在第5行设置判断条件,读取到内容就打印到屏幕,没有则退出while循环

path=r"D:\file\c.txt"
with open(path,"r")as f:
    while True:
        content=f.read(12)
        if content:
            print(content)
        else:
            break

执行结果如下,输出按字节读取的文件内容

hello world

hellopython
2.按行读取

使用文件对象的readline方法,可以按行读取文件,如下所示

path=r"D:\file\c.txt"
with open(path,"r")as f:
    while True:
        content=f.readline()
        if content:
            print(content)
        else:
            break

执行结果如下,输出读取到的内容,包括换行符

hello world

hellopython
3.读取整个文件

读取整个文件有两种方式,一是调用read方法不加读取长度,二是使用readlines方法,如下所示

path=r"D:\file\c.txt"
print("read按字符读取:")
with open(path,"r")as f:
    for content in f.read():
        print(content,end=" ")

print("\n\nreadlines按行读取:")
with open(path,"r")as f:
    for content in f.readlines():
        print(content)

执行结果如下,输出读取到的内容。可以看到,read方法是按字符读取,readlines方法是按行读取

read按字符读取:
h e l l o   w o r l d 
 h e l l o p y t h o n 

readlines按行读取:
hello world

hellopython
4.文件迭代器

文件对象本身就是一个迭代器,因此可以直接遍历文件对象来获取内容,如下

path=r"D:\file\c.txt"
with open(path,"r")as f:
    for content in f:
        print(content)

执行结果如下,输出文件内容

hello world

hellopython
5.延迟读取

read与readlines方法都会将文件内容直接读取到一个内存缓冲区,然后通过遍历的方式从缓冲区取得数据。对于较大的文件,这样就比较消耗内存,使用fileinput.input可以延迟读取数据。如下所示,在第3行,for循环一次,就读取一次数据,而不是一次性将所有数据加载到内存中。

import fileinput

path=r"D:\file\c.txt"
for content in fileinput.input(path):
    print(content)

执行结果如下,输出读取的文件内容

hello world

hellopython

四、序列化和反序列化

大多数时候,为了节省存储空间,都需要将数据进行序列化后再进行存储。另外,对于复杂结构,如某个类的实例,需要存储到文件,也需要进行序列化。同理,若是需要将序列化后的内容进行还原,还需要反序列化。

1.pickle序列化与反序列化

pickle是Python特有的序列化模块,它会将数据序列化成字节。pickle模块dumps、dump来序列化,loads和load来反序列化。
(1)使用dumps序列化和loads反序列化
如下,在第4行,dumps方法将字符串序列化成字节。在第7行,loads方法则将字节反序列化成字符串

import pickle

content="hello world"

data=pickle.dumps(content)
print("dumps序列化后的数据:",data)

content=pickle.loads(data)
print("loads反序列化后的数据:",content)

执行结果如下

dumps序列化后的数据: b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8c\x0bhello world\x94.'
loads反序列化后的数据: hello world

(2)使用dump序列化和load反序列化
dump和load方法同样是将数据序列化成字节,然后再反序列化成字符串,只是dump方法可以一步到位,将序列化后的结果存到文件,load方法则需要从文件读取内容进行反序列化。如下,第6行使用" wb “模式写入文件,第9行使用” rb "模式读取文件,第10行使用load文件对象,直接获取文件内容

import pickle

content="hello world"

path=r"D:\file\c.txt"
print("使用dump将数据序列化到文件!")
with open(path,'wb')as f:
    pickle.dump(content,f)
    
with open(path,'rb')as f:
    content=pickle.load(f)
    print("从文件读取数据:",content)

执行结果如下所示,a是序列化到文件的内容,b是反序列化后打印到屏幕的内容
在这里插入图片描述
a .序列化到文件的内容

使用dump将数据序列化到文件!
从文件读取数据: hello world

b.反序列化后打印到屏幕

2.json序列化与反序列化

json是一种通用的数据存储格式,由于其良好的可读性和性能优势,广泛应用于Web系统传输数据。Python中的json模块,可以将字典类型的数据序列化成字符串,也可以将字符串反序列化成字典类型。如下所示,演示了使用json将字典进行序列化与反序列化

import json

fruit={"name":"apple","price":"12.5"}
data=json.dumps(fruit)
print("dumps序列化后的数据类型:",type(data))
obj=json.loads(data)
print("loads反序列化后的数据类型:",type(obj))
print("loads反序列化后的数据:",obj)

执行结果如下

dumps序列化后的数据类型: <class 'str'>
loads反序列化后的数据类型: <class 'dict'>
loads反序列化后的数据: {'name': 'apple', 'price': '12.5'}

本篇文章就到这里结束了,希望能给小伙伴们一些帮助,喜欢的小伙伴们也可以三连支持一下!!!
在这里插入图片描述

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

8X_I

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值