文件相关操作

        在之前写的程序中,数据都是临时保存在内存中的,程序一结束,这些数据所在的内存空间会全部释放,如果我们想要通过一个程序来加工并长期保存某个数据,就要用到对文件的操作。

        在Python中,有关文件的常见操作有如下方法:

  • 打开文件open
  • 读取文件read
  • 写入内容write
  • 关闭文件close

一、打开文件 

        首先,需要一个变量来接收文件,并使用open关键字:

f = open(文件路径,模式,[编码方式])

        确定好文件路径,以及打开的模式(只读还是可写),还有编码方式(可以不写,如果操作中出现乱码就要指定),那么一个文件对象就创建好了,我们的操作就都在这个变量 f 中进行。

假设我们文件的目录结构如下图所示:

在demo.py中,以下是几种常见的打开方式:

f = open("data.txt", 'r')
f2 = open("./datas/data2.txt", 'w', encoding='utf-8')
f3 = open("D:\Python_Projects\PythonProject\data.txt", 'w', encoding='utf-8')

        f 是打开当前demo.py文件同一目录下的data.txt文件,f2 是使用相对路径的方式,在同一目录下的datas目录中打开data2.txt,f3 是使用绝对路径的方式打开与 f 相同的文件。注意文件名与路径都要用引号括起来,在相对路径中,“./” (点斜杠)表示当前目录,“../” (点点斜杠)表示上级目录,如果要多次返回上级目录,就多写几个“../”

        有一个小技巧是在Pycharm或者其他IDE中,按住Ctrl键对准文件名,如果能点进去,说明这个文件是存在的或正确的。

        第二个参数是指定打开的模式,常见的是只读模式"r"与写入模式"w",而且在写入模式的情况下打开一个不存在的文件,会自动新建一个空的文件,就比如下图的f4,可以看到,原本没有的data3.txt 文件被新建了。

         其他打开文件的常用方式见下表,主要是二进制的读取方式,还有文件在编辑时的“光标”位置的差别,以及组合模式:

打开模式描述
r代表以只读模式打开一个已存在的文件,后续我们对这个文件只能进行读取操作。如果文件不存在,则直接报错。另外,r模式在打开文件时,会将光标放在文件的第一行(开始位置)。 这是默认模式
rb以⼆进制格式打开⼀个文件⽤于只读。⽂件指针 将会放在⽂件的开头。
r+打开⼀个文件⽤于读写。文件指针将会放在文件的开头。
rb+以⼆进制格式打开⼀个文件⽤于读写。文件指针将会放在文件的开头。
w打开⼀个文件只用于写⼊。如果该文件已存在则 打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以⼆进制格式打开⼀个文件只用于写⼊。如果该 文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+打开⼀个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删 除。如果该文件不存在,创建新文件。
wb+以⼆进制格式打开⼀个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a打开⼀个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说新的内容将会被写⼊到已有内容之后。如果该文件不存 在,创建新文件进行写⼊。
ab以⼆进制格式打开⼀个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写⼊到已有内容之后。如果该文件不存在,创建新文件进⾏写⼊。
a+打开⼀个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读 写。
ab+以⼆进制格式打开⼀个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

         其实常见的就三种模式:r、w、a,具体的应用要根据实际情况选择合适的模式,如果在实操中有跟描述不一致的地方,欢迎指出。

        还需要注意的是,在以w模式打开文件时,该文件的所有内容会删掉,也就是说,以w模式打开文件,写入文件时会覆盖原文件。这点尤其要注意,以w模式打开文件只打开不写入的话,几乎等于把原文件删除了。

        第三个参数就是指定编码方式,常见的编码方式有UTF-8,GBK,GB2312,ISO-8859-1等,如果打开的文件有乱码,就需要指定编码方式。

二、读取文件

        常见的读取文件方法如下:

方法名方法说明
read()读取文件的所有内容
read(大小)括号里写的数字是一次读取指定字符数量的内容
readline()一次读取一行
readlines()读取所有的行,返回一个列表

        以下是 data.txt 文件的内容,它一共有四行,每一行的内容都较长,我将以此为基础来演示这些方法:

        使用read()方法:

f = open("data.txt", 'r',encoding='utf-8')
print(f.read())

         可以看见,f.read()的内容被打印出来时是所有的内容。

         我们指定一次只读取10个字符,即把f.read()改成f.read(10):

       可以看到,只读取了文本的前10个字符,注意,是字符数,而不是字节数。也许有些面试题会问到这些细节的东西。

        指定字符数读取文件通常是在文件体积很大时使用,如何一次读取全部内容,会占用很大的内存空间,通常会和while循环一起使用来读取文件的所有内容,循环的条件就是是否读取到空字符串或读取的字符长度为0,这样就代表全部读完了:

f = open("data.txt", 'r', encoding='utf-8')
#f2 = open("./datas/data2.txt", 'w', encoding='utf-8')
#f3 = open("D:\Python_Projects\PythonProject\data.txt", 'w', encoding='utf-8')
#f4 = open("./datas/data3.txt", 'w', encoding='utf-8')

while True:
    content = f.read(10)
    print(content, end = "")
    if len(content) == 0:
        break
f.close()

 可以看到使用一个简单的while True循环也能实现与read一样的效果。

        在readlines方法中,返回的是一个字符串列表,它的元素就是原文件中的一行。

三、写入文件

        对应的方法是write,这里关键要说明一下w模式打开文件时写入与a模式写入文件的区别

        将 f2 以w模式打开data2.txt文件,并写入一串内容:

f2 = open("./datas/data2.txt", 'w', encoding='utf-8')
f2.write("Hello World")
f2.close()

        起初,data2.txt文件的内容与之前演示的data.txt是一致的,执行上面的代码后,data2.txt的内容被覆盖了:

 如果是以a模式打开文件,那么写入的内容就附加到原有内容的后面,这里我就用data.txt演示,由于原文件的一行内容较长为了换行,写入的内容就在前面加了一个换行符:

f = open("data.txt", 'a', encoding='utf-8')
f.write("\nHello World")
f.close()

        可以看到,在a模式下,写入文件是在其后追加内容: 

四、关闭文件、with操作

        在之前的代码演示中,就已经有了关闭文件的操作,任何有关文件的操作到最后都要用close方法关闭文件。

        其实并非每次对文件进行操作时都要写成“f = open(...)”,再“f.colse()”,还有一种能自动关闭文件的操作,就是使用with,请看下面的具体演示,将之前的追加内容的操作写在一个with语句块中,这样能自动关闭文件:

with open("data.txt", 'a', encoding='utf-8') as f:
    print(f.read())
    print(f.readline())
    f.write("\nHello World")

        在上面的代码演示中,open括号内的内容是不变的,后面的as...就是指定打开文件时的对象名,然后在缩进中写各种操作,这点要注意,这样做就可以自动关闭文件。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值