python基础(文件操作)

本文详细介绍了Python中文件操作的基础知识,包括使用open函数打开文件,理解不同的文件模式,以及如何进行读取、写入、随机存取等操作。此外,还讲解了如何正确关闭文件以及使用with语句自动管理文件资源。

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

文件操作

文件和流,能够永久存储数据以及处理来自其他程序的数据。

打开文件

open()

功能:打开或者创建一个文件

格式:open('文件路径','打开模式')

返回值:文件io对象


要打开文件,可使用函数open,它位于自动导入的模块io中。函数open将文件名作为唯一必不可少的参数,并返回一个文件对象。如果当前目录中有一个名为somefile.txt的文本文件(可能是使用文本编辑器创建的),则可像下面这样打开它:
>>> f = open('somefile.txt') 
如果文件位于其他地方,可指定完整的路径。如果指定的文件不存在,将看到类似于下面的异常:
Traceback (most recent call last): 
 File "<stdin>", line 1, in <module> 
FileNotFoundError: [Errno 2] No such file or directory: 'somefile.txt'
如果要通过写入文本来创建文件,这种调用函数open的方式并不能满足需求。为解决这种问题,可使用函数open的第二个参数。


文件模式
调用函数open时,如果只指定文件名,将获得一个可读取的文件对象。如果要写入文件,必须通过指定模式来显式地指出这一点。函数open的参数mode的可能取值有多个,下表对此进行了总结。

 

                                                     函数open的参数mode的最常见取值
                                    值                                                                   描 述
                                     'r'               读取模式(默认值,文件不存在时会创建文件,如果文件已存在则会清空文件)
                                    'w'                        写入模式(文件不存在就报错,存在则准备读取文件)

                                     'x'                       独占写入模式(文件存在则报错,文件 不存在则新建文件)
                                     'a'                附加模式(append 文件不存在则新建,文件存在则在文件末尾追加内容)
                                     'b'                   二进制模式(与其他模式结合使用,binary 辅助模式不能单独使用)
                                      't'                                  文本模式(默认值,与其他模式结合使用)
                                     '+'                    读写模式(与其他模式结合使用,plus 也是辅助模式不能单独使用)

  • r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
  • rb 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
  • rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
  • w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
  • wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
  • wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
  • ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
  • a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
  • ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

 

 

显式地指定读取模式的效果与根本不指定模式相同。写入模式让你能够写入文件,并在文件不存在时创建它。独占写入模式更进一步,在文件已存在时引发FileExistsError异常。在写入模式下打开文件时,既有内容将被删除(截断),并从文件开头处开始写入;如果要在既有文件末尾继续写入,可使用附加模式。


'+'可与其他任何模式结合起来使用,表示既可读取也可写入。例如,要打开一个文本文件进行读写,可使用'r+'。(你可能还想结合使用seek)请注意,'r+'和'w+'之间有个重要差别:后者截断文件,而前者不会这样做。


默认模式为'rt',这意味着将把文件视为经过编码的Unicode文本,因此将自动执行解码和编码,且默认使用UTF-8编码。要指定其他编码和Unicode错误处理策略,可使用关键字参数encoding和errors。这还将自动转换换行字符。默认情况下,行以'\n'结尾。读取时将自动替换其他行尾字符('\r'或'\r\n');写入时将'\n'替换为系统的默认行尾字符(os.linesep)。


通常,Python使用通用换行模式。在这种模式下,后面将讨论的readlines等方法能够识别所有合法的换行符('\n'、'\r'和'\r\n')。如果要使用这种模式,同时禁止自动转换,可将关键字参数newline设置为空字符串,如open(name, newline='')。如果要指定只将'\r'或'\r\n'视为合法的行尾字符,可将参数newline设置为相应的行尾字符。这样,读取时不会对行尾字符进行转换,但写入时将把'\n'替换为指定的行尾字符。

 

b二进制模式下,不能指定编码,以二进制形式写入文件中,需要对字符串内容进行二进制转换,用bytes(‘内容’)转换。

如果文件包含非文本的二进制数据,如声音剪辑片段或图像,你肯定不希望执行上述自动转换。为此,只需使用二进制模式(如'rb')来禁用与文本相关的功能。
还有几个更为高级的可选参数,用于控制缓冲以及更直接地处理文件描述符。

 

文件的基本方法
类似于文件的对象支持文件对象的一些方法,如支持read或write,或者两者都支持。urlopen返回的对象就是典型的类似于文件的对象,它们支持方法read和readline,但不支持方法write和isatty。

读取和写入

  • read()

功能:读取文件

格式1: 文件io对象.read()

返回值:整个文件的字符

格式2: 文件io对象.read(字符长度)

返回值:指定长度的字符

  • write()

功能:写入文件

格式:文件io对象.write(字符串)

返回值:写入字符串的长度

 

文件最重要的功能是提供和接收数据。如果有一个名为f的类似于文件的对象,可使用f.write来写入数据,还可使用f.read来读取数据。与Python的其他大多数功能一样,在哪些东西可用作数据方面,也存在一定的灵活性,但在文本和二进制模式下,基本上分别将str和bytes类用作数据。
每当调用f.write(string)时,你提供的字符串都将写入到文件中既有内容的后面。
>>> f = open('somefile.txt', 'w') 
>>> f.write('Hello, ') 

>>> f.write('World!') 

>>> f.close() 
请注意,使用完文件后,我调用了方法close。读取也一样简单,只需告诉流你要读取多少个字符(在二进制模式下是多少字节),如下例所示:
>>> f = open('somefile.txt', 'r') 
>>> f.read(4) 
'Hell' 
>>> f.read() 
'o, World!' 
首先,指定了要读取多少(4)个字符。接下来,读取了文件中余下的全部内容(不指定要读取多少个字符)。请注意,调用open时,原本可以不指定模式,因为其默认值就是'r'。

 

文件指针操作(随机存取)

  • tell()

功能:查看当前指针的位置

格式:文件io对象.tell()

返回值:整数

  • seek()

功能:调整指针的位置

格式1: 文件io对象.seek(N) 将指针直接调整到N的位置,从开头计算第N个位置

返回值:指针的位置

格式2: 文件io对象.seek(偏移位置,以下参考点方式)

返回值:指针的位置

参考点方式:

0 从文件的最开头计算偏移 (默认值,可以不写)

1 从文件上一次调整指针的位置开始计算偏移

2 从文件末尾开始计算偏移(光标指针的值需要填成负数,从末尾倒着读)

 

 

在这里,我将文件都视为流,只能按顺序从头到尾读取。实际上,可在文件中移动,只访问感兴趣的部分(称为随机存取)。为此,可使用文件对象的两个方法:seek 和 tell。
方法 seek(offset[, whence])将当前位置(执行读取或写入的位置)移到 offset 和whence 指定的地方。参数 offset 指定了字节(字符)数,而参数 whence 默认为 io.SEEK_SET(0),这意味着偏移量是相对于文件开头的(偏移量不能为负数)。参数 whence 还可设置为 io.SEEK_CUR(1)或 io.SEEK_END(2),其中前者表示相对于当前位置进行移动(偏移量可以为负),而后者表示相对于文件末尾进行移动。请看下面的示例:
>>> f = open(r'C:\text\somefile.txt', 'w') 
>>> f.write('01234567890123456789') 
20 
>>> f.seek(5) 


>>> f.write('Hello, World!') 
13 
>>> f.close() 
>>> f = open(r'C:\text\somefile.txt') 
>>> f.read() 
'01234Hello, World!89'
方法 tell()返回当前位于文件的什么位置,如下例所示: 
>>> f = open(r'C:\text\somefile.txt') 
>>> f.read(3) 
'012' 
>>> f.read(2) 
'34' 
>>> f.tell() 

 

读取和写入行

  • readline()

功能:读取一行文件

格式1: 文件io对象.readline()

返回值:一行内容的字符串

格式2: 文件io对象.readline(字符长度)

返回值:一行内容的字符串

注意:字符长度<当前行内内容,则读取指定长度的字符串,并且下次再读取还是在这个一行中获取没有读取的内容。

 

字符长度>=当前行内容,直接读取当前行

 

  • readlines()

功能:将文件中的内容读取到序列当中。

格式1: 文件io对象.readlines()

返回值:列表

格式2: 文件io对象.readlines(字符长度)

返回值:列表

注意:读取的行数由字符长度决定,如果字符长度读取了N行后,还有指定长度的字符没有读取,则直接读取下一行进来

  • writelines()

功能:将序列写入文件中

格式:文件io对象.writelines(序列)

返回值:None


实际上,前面所做的都不太实用。与其逐个读取流中的字符,不如成行地读取。要读取一行(从当前位置到下一个分行符的文本),可使用方法readline。调用这个方法时,可不提供任何参数(在这种情况下,将读取一行并返回它);也可提供一个非负整数,指定readline最多可读取多少个字符。因此,如果some_file. readline()返回的是'Hello, World!\n',那么
some_file.readline(5)返回的将是'Hello'。要读取文件中的所有行,并以列表的方式返回它们,可使用方法readlines。
方法writelines与readlines相反:接受一个字符串列表(实际上,可以是任何序列或可迭代对象),并将这些字符串都写入到文件(或流)中。请注意,写入时不会添加换行符,因此你必须自行添加。另外,没有方法writeline,因为可以使用write。

 

 

关闭文件

  • close()

功能:关闭文件

格式:文件io对象.close()

返回值:None


别忘了调用方法close将文件关闭。通常,程序退出时将自动关闭文件对象(也可能在退出程序前这样做),因此是否将读取的文件关闭并不那么重要。然而,关闭文件没有坏处,在有些操作系统和设置中,还可避免无意义地锁定文件以防修改。另外,这样做还可避免用完系统可能指定的文件打开配额。
对于写入过的文件,一定要将其关闭,因为Python可能缓冲你写入的数据(将数据暂时存储在某个地方,以提高效率)。因此如果程序因某种原因崩溃,数据可能根本不会写入到文件中。安全的做法是,使用完文件后就将其关闭。如果要重置缓冲,让所做的修改反映到磁盘文件中,但又不想关闭文件,可使用方法flush。然而,需要注意的是,根据使用的操作系统和设置,flush可能出于锁定考虑而禁止其他正在运行的程序访问这个文件。只要能够方便地关闭文件,就应将其关闭。

要确保文件得以关闭,可使用一条try/finally语句,并在finally子句中调用close。
# 在这里打开文件
try: 
     # 将数据写入到文件中
finally: 
     file.close()
实际上,有一条专门为此设计的语句,那就是with语句。
with open("somefile.txt") as somefile: 
      do_something(somefile) 
with语句让你能够打开文件并将其赋给一个变量(这里是somefile)。在语句体中,你将数据写入文件(还可能做其他事情)。到达该语句末尾时,将自动关闭文件,即便出现异常亦如此。

 

使用文件的基本方法
假设文件somefile.txt包含以下代码所示的文本,可对其执行哪些操作呢?

Welcome to this file 
There is nothing here except 
This stupid haiku 
我们来试试前面介绍过的方法,首先是read(n)。
>>> f = open(r'C:\text\somefile.txt') 
>>> f.read(7) 
'Welcome' 
>>> f.read(4) 
' to ' 
>>> f.close() 

接下来是read():
>>> f = open(r'C:\text\somefile.txt') 
>>> print(f.read()) 
Welcome to this file 
There is nothing here except 
This stupid haiku 
>>> f.close()
下面是readline():
>>> f = open(r'C:\text\somefile.txt') 
>>> for i in range(3): 
            print(str(i) + ': ' + f.readline(), end='') 
0: Welcome to this file 
1: There is nothing here except 
2: This stupid haiku 
>>> f.close() 
最后是readlines():
>>> import pprint 
>>> pprint.pprint(open(r'C:\text\somefile.txt').readlines()) 
['Welcome to this file\n', 
'There is nothing here except\n', 
'This stupid haiku'] 
请注意,这里我利用了文件对象将被自动关闭这一事实。下面来尝试写入,首先是write(string)。
>>> f = open(r'C:\text\somefile.txt', 'w') 
>>> f.write('this\nis no\nhaiku') 
13 
>>> f.close() 
运行上述代码后,这个文件包含的文本如以下代码所示。

修改后的文本文件
this 
is no 
haiku 
最后是writelines(list):
>>> f = open(r'C:\text\somefile.txt') 
>>> lines = f.readlines() 
>>> f.close() 
>>> lines[1] = "isn't a\n" 
>>> f = open(r'C:\text\somefile.txt', 'w') 
>>> f.writelines(lines) 
>>> f.close() 
运行这些代码后,这个文件包含的文本如以下代码所示。

再次修改后的文本文件
this 
isn't a 
haiku 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值