Python的文件操作(I/O)

本文详细介绍了Python中的文件操作,包括文件的打开、关闭、读取和写入。内容涵盖open()函数的使用,文件读取的read()、readline()、readlines()方法,写入的write()、writelines()函数,以及with...as...语句的运用,强调了文件操作完成后必须关闭文件的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 文件的打开

  • 文件(file)通过Python程序来对计算机中的各种程序进行增删改查的操作,文件也叫做 I/O(Input/Output)
  • 文件的打开的操作步骤
    • 打开文件
    • 对文件进行修改、保存的操作
    • 关闭文件
  • 文件会有一个返回值。返回一个对象,返回的这个对象就是当前文件的本身。
  • open()函数
    • 在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。
    • open() 用于创建和打开指定文件
    • 语法:file_object = open(file,mode=‘r’,buffering=None,encoding=None)
    • 个数参数的用法:
      • file_object:要创建的文件对象
      • file:想要访问的文件名的字符串的值
      • mode :可选参数,指的是文件的打开方式,默认为 r
      • buffering:可选参数,用于对指定文件进行读写操作时,是否使用缓冲区
      • enconding:手动设定打开文件的编码格式,如果不对编码格式进行修改,默认为cp936,为GBK模式
# 1.txt 文件已经创建
file = open('1.txt')
print(file)
<_io.TextIOWrapper name='1.txt' mode='r' encoding='cp936'>

file = open('1.txt', encoding='utf-8')
print(file)
<_io.TextIOWrapper name='1.txt' mode='r' encoding='utf-8'>

# 注意:手动修改enconding的值仅限于文本文件,也就是说以二进制模式打开时,不能对enconding参数值进行任何的修改,否则会抛出 ValueError 异常
模式意义注意事项
r只读模式打开文件,读文件内容的指针会放在文件的开头(默认)操作的文件必须存在
rb以二进制模式、只读格式打开文件,读文件内容的指针位于开头,一般用于非文本文件(音频文件、图片文件)操作的文件必须存在
r+打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。操作的文件必须存在
rb+以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)操作的文件必须存在
w以只写模式打开,若该文件存在,打开时会覆盖原文件的内容若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
wb以二进制模式、只写格式打开,一般用于非文本文件(音频文件)若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
w+打开文件后会对原文件内容进行清空,并对该文件有读写权限若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
wb+以二进制格式,读写模式打开文件,一般用于非文本文件若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
a以追加模式打开文件,对文件只有写的权限。如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。
ab以二进制模式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。
a+以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。
ab+以读写模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。
  • open()函数对象的常用属性
    成功打开文件以后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,常见属性为:
    • file.name:返回打开文件的名称
    • file.mode:返回打开文件时,采用的文件打开格式
    • file.enconding:返回打开文件时,采用 的文件打开的编码格式
    • file.closed:判断文件是否已经关闭
file = open('1.txt', encoding='utf-8')
# print(file)
# 判断打开文件的名字
print(file.name)

# 输出打开文件是否关闭
print(file.closed)

# 输出打开文件的编码方式
print(file.encoding)

# 输出打开文件的格式
print(file.mode)


# 输出结果
1.txt
False
utf-8
r

注意:用open()函数打开的文件对象,必须手动进行关闭,Python垃圾回收机制无法自动回收打开的文件所占用的资源

2. 文件的关闭

  • close()函数是专门用来关闭已经打开的文件的
  • 语法格式: file.close()。其中 file 表示已打开的文件的对象

读者可能一直存在这样的疑问,即使用 open() 函数打开的文件,在操作完成之后,一定要调用 close() 函数将其关闭吗?答案是肯定的。文件在打开并操作完成之后,就应该及时关闭,否则程序的运行可能出现问题。

  1. 如果我们没有手动关闭文件的话,对文件进行删除会抛出错误
import os
file = open('1.txt', encoding='utf-8')
os.remove('1.txt')# # PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: '1.txt'
os.remove()用于删除文件
  1. 如果我们手动将文件关闭,在对文件进行删除
import os
file = open('1.txt')
file.close()
os.remove('1.txt')

3. 文件的读取

  1. read()函数:逐个字节或字符读取文件中的内容
  2. readline()函数:逐行读取文件中的内容
  3. readlines()函数:一次性读取文件中多行内容
3.1 read()函数

对于借助open()函数,并以可读模式(r,r+,rb,rb+)打开的文件,可以调用read()函数逐个字节(逐个字符)读取文件中的内容

如果文件是以文本模式(非二进制模式)打开的,read()函数会逐个字符进行读取。如果文件是以二进制模式打开的,read()函数会逐个字节进行读取

read()函数基本语法:file.read([size])

  • 其中:file 表示已经打开的文件对象,size 作为可选参数,用于指定一次最多读取的字符(字节)的个数,如果省略,则默认一次性地读取所有的内容

示例一:

file = open('1.txt')
f = file.read()
file.close()
print(f)

# Python
# http://www.xxx.com/

示例二:我们对size进行指定值

file = open('1.txt')
f = file.read(6)
file.close()
print(f)

# Python

# 采用二进制逐个字符的读取文件的内容
file = open('1.txt', 'rb')
f = file.read()
file.close()
print(f)

# b'Python\r\nhttp://www.xxx.com/'

3.2 readline()函数

和 read() 函数不同,readline()函数和readlines()函数都以“行”作为读取单位,即每次都读取目标文件中的一行。对于读取以文本格式打开的文件,读取一行很好理解;对于读取以二进制格式打开的文件,它们会以“\n”作为读取一行的标志。

  • readline()函数用于读取文件中的行,包括 “ \n ”
  • 语法:file.readline([size])
  • 其中:file 作为文件对象,size 为可选参数,用于指定每一行,一次最多读取的字符(字节)数

和 read()一样,此函数成功读取文件数据的前提是,使用open()函数指定文件的打开模式为可读模式(r、r+、rb、rb+ 四种)


file = open('1.txt', encoding='utf-8')
f = file.readline()
file.close()
print(f)  # Python学习

由于readline()函数在读取文件中一行内容的时候,会读取到最后的换行符“ \n ”,再加上print()函数输出时默认换行,所有输出的结果中会多看到一个换行


file = open('1.txt', 'rb+')
f = file.readline(6)
file.close()
print(f)  # b'Python'

3.3 readlines()函数

readlines()函数读取文件中的所有行,它与调用不指定size参数的read()类似,只不过该函数返回字符串列表,其中每个元素为文件中的一行内容

和 readline()函数一样,readlines()函数在读取每一行内容时,会连同末尾的换行符一同读取

  • readlines()的基本语法:

file.readlines()

其中,file 为打开的文件对象。和 read()、readline() 函数一样,它要求打开文件的模式必须为可读模式(包括 r、rb、r+、rb+ 4 种)。

file = open('1.txt', 'rb')
f = file.readlines()
file.close()
print(f)
# [b'Python\xe5\xad\xa6\xe4\xb9\xa0\r\n', b'http://www.xxx.com/']


file = open('1.txt', encoding='utf-8')
f = file.readlines()
file.close()
print(f)
# ['Python学习\n', 'http://www.xxx.com/']

4. 文件的写入

4.1 write()函数

python中的文件对象中提供了write()函数,可以向文件中写入指定内容

  • 语法:file.write(string)

    • 其中:file表示文件打开对象, string 表示要写入的字符串(或字节串,仅限于写入二进制文件中)

    • 在使用write()写入文件时,需保证open()函数是以 r+、w、w+、a 或 a+ 的模式打开文件,否则会抛出 io.UnsupportedOperation 错误。

  • 1.txt文件的内容如下:

Python学习
http://www.xxx.com/


file = open('1.txt', 'w', encoding='utf-8')
f = file.write('新写入的数据')
# 新写入的数据


file = open('1.txt', 'a', encoding='utf-8')
f = file.write('\n新写入的数据')
# Python学习
# http://www.xxx.com/
# 新写入的数据

注意:在写入文件之后,一定要使用close()函数将打开的文件关闭,否则写入的内容不会保存到打开的文件中。因为,在我们写入文件内容的时候,操作系统不会立刻把数据写入磁盘,而是先缓存起来(存放到缓冲区),只有调用close()函数时,操作系统才会把全部的数据写入到磁盘文件中。

4.2 writelines()函数

writelines()函数可以实现将字符串列表写入到文件中

注意:这里只有write()函数和 writelines()函数,而没有 writeline()函数

5 with…as… : 用法

5.1 with … as … 语句的导入

  • 在任何一门编程语言中,文件的输入和输出,数据库的连接断开等,都是很常见的资源管理操作。但资源是有限的,在写程序的时候必须为保证这些资源在使用后得到释放,不然很容易造成资源泄露,轻者会使系统处理缓慢,重者会使系统崩溃。
  • 在进行文件操作的时候,在文件打开最后一定要关闭文件,否则很容易造成意想不到的隐患。但是,即便使用了close()进行文件关闭操作,如果在打开文件或者打开文件的过程中抛出了异常,还是无法关闭文件。
  • 在Python中,我们使用with … as … 语句操作上下文管理器,它能够帮助我们自动分配资源并且释放资源。

5.2 with … as …

  • 使用 with … as … 操作已经打开的文件对象(本身就是上下文管理器),无论期间是否抛出异常,都能保证语句执行完以后,能够自动关闭已经打开的文件
  • with as 语法:
  • with 表达式 [as target]:
    代码块

  • 我们向1.txt 中写入语句
with open('1.txt', 'a', encoding='utf-8') as f:
    f.write('这是一句新的语句')

  • 运行结果为

Python学习
http://www.xxx.com/
这是一句新的语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值