python之文件操作(open与with...open...as)

一 文件的打开与关闭

1. 文件的打开与关闭

python中用open()函数来打开一个文件,close()方法来关闭一个文件。 这里先记录用open()函数和close()方法来操作文件,with…as 放后面再记录。如果用open()来操作一个文件,那么一定要用文件的close()方法来关闭文件,这样才能保证数据全部被写入到文件中,否则可能存在数据丢失。 语法格式如下

  • 打开文件
#语法格式
open(filename, mode, enconding)
#常用参数
filename: 文件名字.后缀
mode: 打开文件的方式
enconding: 编码方式
  • 关闭文件
#语法格式
filename.close()

例子:以w(只写入模式,如果没有改文件,则新创建一个文件)模式打开test.txt文件,并写入内容:键盘敲烂,工资过万

#open()函数的使用
file = open("test.txt", 'w')
#写入内容
file.write("键盘敲烂,工资过万")
#关闭文件
file.close()

我们在当前py文件目录下可以看到,已经新建了一个test.txt文件,并写入了内容,如下
在这里插入图片描述
其中要注意的是文件的路径,可以在当前路径,可以在其它路径。

2. 文件的属性

python中文件也是对象,它也有自己的属性,常用的如下

  • file.name:返回文件的名字
  • file.closed:查看文件是否关闭,如果已关闭就返回True,否则返回False
  • file.mode:返回文件被访问的模式
  • file.enconding:返回文件的编码方式
    如下:
#open()函数的使用
file = open("test.txt", 'w')
#写入内容
file.write("键盘敲烂,工资过万")
#查看文件是否关闭
print("文件是否关闭:", file.closed)

#关闭文件
file.close()

#查看文件属性
print("文件是否关闭:", file.closed)
print("文件的名字:", file.name)
print("文件的访问模式:", file.mode)
print("文件的编码是:", file.encoding

在这里插入图片描述

二 文件的访问模式(mode参数


python中访问文件时默认为文本模式,如果要以二进制模式打开,加上 b,各种模式如下

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

三 文件的读写

在了解了怎么打开关闭文件,以及以什么方式访问文件后,下面来看一下文件的读写操作

1. 文件的写操作write()方法

python通过文件对象的 write() 方法来将字符串写到文件中,不过在写的时候不会自动换行,如果做换行操作,要自行加换行符\n,如下

#open()函数的使用
file = open("test.txt", 'w')
#写入内容
msg = "键盘敲烂\n工资过万\n有一种投资会永远不会亏本\n那就是投资自己"
file.write(msg)

#关闭文件
file.close()

在这里插入图片描述

2. 文件的读操作

python中读取文件的方法有三种,分别是read(),readline()和readlines(),三者的用法如下

  • read([size]):默认读取全部文件内容,如果有size参数,则读取前size个字节数。
#open()函数的使用
file = open("test.txt", 'r')
#读取文件内容
msg = file.read()
print(msg)

#关闭文件
file.close()

在这里插入图片描述

  • readline():按行读取文件的内容,换行符号 ‘\n’。
#readline()按行读取文件内容
file = open("test.txt", 'r')
#读取文件内容
msg1 = file.readline()
print("这是第一行:", msg1.rstrip())
msg2 = file.readline()
print("这是第二行:", msg2.rstrip())

#关闭文件
file.close()

在这里插入图片描述

  • readlines():以列表的形式返回读取内容,列表的每一个元素对应文件的一行。
#readlies()读取文件内容,以列表形式返回
file = open("test.txt", 'r')
#读取文件内容
msg = file.readlines()
print(msg)

#关闭文件
file.close()

在这里插入图片描述

四 with…open…as操作文件

前面已经说过,我们在用open()函数操作文件时,一定要调用close()方法来关闭文件,即一定要保证文件要关闭。这是因为文件操作是一个I/O操作,当我们写文件时,操作系统往往不会立即把数据写入到磁盘,而是先放到内存缓存起来,等空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘同时释放资源。如果不这样做的话,可能造成数据丢失和资源浪费。

上面写的一些代码示范其实是不严谨的,如果我在打开文件后,对文件进行操作时发生了异常,又没有做异常处理,那么程序就会抛错,close()方法就不会被执行,从而就会出现上面的风险。

可以使用异常处理try…except…finally来编写,将close()方法放在finally后面,这样即便前面的代码出错了,文件也照样能关闭如下

#文件操作
try:
    file = open("test.txt", 'w')
    msg = "键盘敲烂\n工资过万\n抛弃一切幻想\n努力前行!"
    file.write(msg)
except:
    pass
finally:
    file.close()

上面的处理方式虽然可以,但是不符合pytho的风格,不够简洁。于是with…open…来了,它的作用和try…except…finally一样,能够确保文件一定被关闭,不用手动再调用close方法,书写方式如下

#with open操作文件
with open("test.txt", 'w') as f:
    msg = "键盘敲烂\n工资过万\n抛弃一切幻想\n努力前行!"
    f.write(msg)

#查看文件状态
print("文件是否关闭:", f.closed)

在这里插入图片描述

五 定位操作 tell() 和 seek()

在操作文件时,当我们想知道,当前指针位置和改变指针位置时,可以使用文件对象的tell()方法和seek()方法,如下

  • tell():返回指针的位置
  • seek(offset[,whence]):改变当前指针的位置,offset参数表示要移动的字节数,from参数可有可无,表示要移动的参考位置。如果whence=0,则使用文件开头的位置作为参考位置;如果whence=1,则使用当前的位置作为参考位置;如果whence=2,则使用文件末尾的位置作为参考位置。
#with open操作文件
with open("test.txt", 'w', encoding="utf-8") as f:
    msg = "键盘敲烂\n工资过万\n抛弃一切幻想\n努力前行!"
    # msg = "123\n456\n789"
    f.write(msg)

#文件定位操作
with open("test.txt", 'r', encoding="utf-8") as f:
    msg1 = f.readline()
    print(msg1.rstrip())
    #打印当前指针位置
    print("当前指针位置: ", f.tell())

    #将指针定位到文件开头
    print("从文件开头移动14个字节后读取文件内容:")
    ps = f.seek(f.tell(), 0)
    msg2 = f.read()
    print(msg2.rstrip())

在这里插入图片描述
这里需要注意的是当操作文件模式不带b(即不是rb,wb,ab)时,seek()的whence参数只能为0,即只能从文件开头进行偏移。 不然会报下面的错

在这里插入图片描述
在这里插入图片描述

如果seek()参数whence要设置为1或者2,那么操作模式必须带有b,即rb,wb或者ab

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值