python3-文件操作和指针

系列文章目录

一、文件操作的基本流程

1. 打开文件

  • 使用open来打开文件,其返回值是文件类型,可以使用变量进行保存,之后就可以通过文件对象来操作文件。

    f = open('/home/hugh/a.txt')  # 参数是文件路径
    
  • 注意:因为在python中,反斜杠 \ 代表转义字符,如 \r 表示回车等。所以在windows系统下写文件路径可能会遇到一些问题:

    open('C:\user\rom\a.txt')  # 会报错,因为包含 \r 转义字符
    

    在字符串前写一个 r ,代表原生字符串,就会忽略掉转义字符了(推荐)。

    open(r'C:\user\rom\a.txt')
    

    也可以直接写成反斜杠 / ,open会进行自动转换。

    open('C:/user/rom/a.txt') 
    

2. 操作文件

  • 使用read来读取文件内容,它有一个可选参数,在t模式下表示读取的字符个数,在b模式下表示读取的字节个数

    f.read(1024)  # 从外存文件读取1024个字节(或字符)所有内容到内存中。
    
  • 使用write来向文件写入内容,它不会立刻将内容写入外存文件,而是先保存在内存中。

    f.write('hello, hugh')  # 将字符串写入内存中的文件对象。
    
  • 其他操作:

    f.readline()  # 从文件读取一行,包括 "\n" 字符
    f.readlines()  # 从文件读取剩余的所有行,以列表形式返回
    
    f.writelines(['hello,', 'hugh']) # 接收一个可迭代对象写入内存文件对象。
    
    f.flush()  # 将内存中的文件内容立刻写入外存中的文件中。
    

3. 关闭文件

  • 使用close来关闭文件,回收操作系统资源(操作系统能同时打开的文件数是有限的)。

    f.close()
    

    关闭文件之后就不能再执行读取操作了。

二、with语句

​ 为了防止程序员再写代码时,忘记关闭文件对象,python提供了一种语法糖,称为 with语句,可以帮助程序员自动执行close方法,自动关闭文件对象。

  • 定义:

    # 开头写一个 with ,打开多个文件用逗号隔开
    with open('a.txt') as f1, open('a.txt') as f2:  # as后面写变量名,用于保存文件对象
        res1 = f1.read()
        res2 = f2.read()
        # 不需要再写 f.close()
    

三、字符编码和模式

1. 指定字符编码

​ encoding参数就是解码时用到的编码格式,在linux和mac中默认为 utf-8,windows默认为gbk

with open('a.txt', encoding='utf-8') as f:
    pass

2. 文件打开模式

  • t - 文本模式(默认):

    1. 文件内容的读写都是以字符(unicode编码)为单位的。
    2. 只能用于打开文本文件。
    3. 可以指定字符编码:encoding=’utf-8’。
  • b - binary模式:

    1. 文件内容的读写都是以bytes为单位的。
    2. 可以用于打开所有文件(图片、可执行文件等都能打开)。
    3. 不能指定字符编码!

    文件打开模式不能单独使用,必须和下面的文件操作模式连用:

    with open('a.txt', mode='rt', encoding='utf-8') as f:  # mode默认的模式就是rt
        pass
    

关于字符编码的内容,可以看作者的另一篇文章:字符编码的概念和发展史

3. 文件操作模式

  • r模式(默认):

    只读模式,不能进行写操作。当文件不存在时,会报错。

  • w模式:

    只写模式,不能进行读操作。当文件不存在时,会创建空文件。当文件存在时,会清空原有的内容!

    注意:w模式在每次打开文件时都会清空原有内容

  • a模式:

    追加模式,不能进行读操作。当文件不存在时,会创建空文件。当文件存在时,会将新内容写到原有内容的最后面。

  • +模式:

    与w、r、a模式连用:在原有基础上,使不能读的可以读,不能写的可以写,但原有特性不变,r+会在文件末尾追加内容。

  • x模式:

    只写模式,与w模式的区别在于:当文件存在时,w模式会清空文件,x模式会报错。

举例:以文本模式向utf-8编码的文件中追加“hello,hugh”:

with open('hello.txt', mode='at', encoding='utf-8') as f:
    f.write('hello,hugh')

4. b模式下的编码和解码

​ 使用t模式操作文本文件,只需在打开文件时,指定文件所用的字符编码encoding。而在b模式下,不能在打开时指定字符编码,python解释器不知道文件的编码格式,所以在用b模式操作文本文件时,需要进行额外的操作。

  • 编码:

    使用encode方法,可以将字符串按照指定的编码格式进行编码。

    with open('hello.txt', mode='wb') as f:
        f.write('hello,hugh'.encode('utf-8'))  # 直接写入会导致乱码
    
  • 解码:

    使用decode方法,可以将读出的bytes类型,按照指定的编码格式解码为字符串。

    with open('hello.txt', mode='rb') as f:
        res = f.read(1024).decode('utf-8')  # 1024代表读1024个字节,不写就读出全部
    

四、文件指针

1. 文件指针的概念

​ 文件指针也叫文件游标,它是用来指向文件内的一个位置

​ 比如,以r模式打开一个文件的时候,文件指针就指向了文件的最开头,这时使用read方法读取文件内容,指针就会向右(文件末尾方向)移动,将期间遇到的每一个字符都会被读出到内存中,直到移动到末尾,完成读取操作。

​ 再次使用read读文件时,就读不出任何内容了,因为指针已经到了最后,没有内容可读了。

2. 移动指针

  • 移动单位:

    指针以字节为单位进行移动,只有在t模式下以字符为单位移动。

  • 移动方法:

    seek方法用来移动指针,第一个参数是移动的单位数,正数代表右移,负数代表左移;第二个参数是基准:

    • 0:以文件开头为基准**(t模式只能使用此基准)**
    • 1:当前指针所在位置为基准
    • 2:以文件末尾为基准
    f.seek(9, 0)  # 以文件开头为基准,向右移动9个单位
    f.seek(0, 2)  # 移动到末尾
    

3. 获取指针位置

f.tell()会返回文件指针当前的位置。

下一篇

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

花_城

你的鼓励就是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值