Python文件模式及操作详解

一、open() 方法

open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数。

如果该文件无法被打开,会抛出 OSError。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

完整的语法格式为:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

1、file: 必需,文件路径(相对或者绝对路径)。

例如:
采用相对路径“f = open("…/test.txt",mode=‘w’)”打开上级文件夹的“test.txt”文件。

采用绝对路径“f = open(“d:/test.txt”,mode=‘w’)”打开D盘根文件夹的“test.txt”文件。

2、mode: 可选,文件打开模式。

默认值为‘rt’,表示只读文本模式。

3、buffering: 可选,设置缓冲。

缺省或设置为-1时,默认是8192个字节,8192/1024 = 8k。
设置为 0 时,表示不使用缓冲区,直接读写,仅在二进制模式下有效。
设置为 1 时,表示在文本模式下使用行缓冲区方式。
设置为 大于1 时,表示缓冲区的设置大小。

4、encoding: 一般使用utf8。

5、errors: 报错级别。

6、newline: 区分换行符。

7、closefd: 传入的file参数类型。

8、opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

二、mode 参数

x 写模式,新建一个文件,如果该文件已存在则会报错。

U 通用换行模式(Python 3 不支持)。

三、file 对象

file 对象使用 open 函数来创建,下表列出了 file 对象常用函数:

四、文件打开与关闭

f = open(…)是由操作系统打开文件。

如果打开的是文本文件,会涉及到字符编码问题。

如果没有为open指定编码,那么打操作系统会用自己的默认编码去打开文件。

在windows下是gbk,在linux下是utf-8。


默认打开模式为 r ,文件不存在则报错,文件存在则文件内指针直接跳到文件开头。

f=open('a.txt','r',encoding='utf-8') 

下面一个代码会将文件的内容由硬盘全部读入内存,赋值给res。

res=f.read() 

最后要向操作系统发起关闭文件的请求,回收系统资源。

f.close()


例如:

with open('test.txt', mode='rt', encoding='utf-8') as f:
    for line in f:
        print(line,end='')

可用with同时打开多个文件,用逗号分隔开即可

with open('a.txt','r') as read_f,open('b.txt','w') as write_f:  
    data = read_f.read()
    write_f.write(data)

五、注册及认证用例

例如,实现用户注册及认证功能:

# 1.注册模块
name = input('请输入您的注册名: ').strip()
pwd = input('请输入您的密码: ').strip()
with open('database.txt', mode='a', encoding='utf-8') as f:
    info = '%s:%s\n' % (name, pwd)
    f.write(info)
# 2.登录模块
inp_name = input('请输入您的账号: ').strip()
inp_pwd = input('请输入您的密码: ').strip()
with open(r'database.txt', mode='r', encoding='utf-8') as f:
    for line in f:
        # 把用户输入的名字与密码与读出内容做比对
        u, p = line.strip('\n').split(':')
        if inp_name == u and inp_pwd == p:
            print('恭喜您登录成功!')
            break
    else:
        print('您输入的账号名或者密码错误!')

六、w 模式的使用

w是只写模式:在文件不存在时创建空文档;文件存在时清空文件,文件指针跑到文件开头。

with open('b.txt',mode='w',encoding='utf-8') as f:
    f.write('123\n')
    f.write('1234\n') 
    f.write('12345\n')

在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面。

如果重新以w模式打开文件,则会清空文件内容。

七、控制文件读写的模式

前提: t、b模式均不能单独使用,必须与r/w/a之一结合使用

t(默认):文本模式

1、读写文件都以字符串为单位
2、 只能针对文本文件。
3、必须指定encoding参数。
4、如果我们指定的文件打开模式为r/w/a,其实默认就是rt/wt/at。

b:二进制模式

1、读写文件都以二进制为单位
2、可以针对所有文件。
3、一定不能指定encoding参数。

b模式对比t模式:

1、在操作纯文本文件方面 t 模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便。

2、针对非文本文件(如图片、视频、音频等)只能使用b模式。

八、读操作

f.read() # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾

f.readline() # 读取一行内容,光标移动到第二行首部

f.readlines() # 读取每一行内容,存放于列表

f.read()与f.readlines()都是将内容一次性读入内容,如果内容过大会导致内存溢出。

若还想将内容全读入内存,则必须分多次读入,有两种实现方式:

方式一

with open('a.txt',mode='rt',encoding='utf-8') as f:
    for line in f:
        print(line) # 同一时刻只读入一行内容到内存中

方式二

with open('1.mp4',mode='rb') as f:
    while True:
        data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中
        if len(data) == 0:
            break
        print(data)

九、控制文件内指针移动

文件内指针的移动都是Bytes为单位的,唯一例外的是 t 模式下的read(n),以n个字符为单位。

with open('a.txt',mode='rt',encoding='utf-8') as f:
     data=f.read(3) # 读取3个字符

with open('a.txt',mode='rb') as f:
     data=f.read(3) # 读取3个Bytes

若想读取文件某一特定位置的数据,则需要用 f.seek 方法控制文件内指针的移动。

详细用法如下:

 f.seek(指针移动的字节数,模式控制)

十、seek模式控制

0:默认,该模式代表指针移动的字节数是以文件开头的位置为参照的。

1:该模式代表指针移动的字节数是以当前位置为参照的。

2:该模式代表指针移动的字节数是以文件末尾的位置为参照的。

注意:其中 0 模式可以在 t 或 b 模式使用,而 1 跟 2 模式只能在 b模式下用

十一、文件的修改

注意:

1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容。

2、内存中的数据是可以修改的。

文件修改是将硬盘中文件的内容读入内存,然后在内存中修改完毕后再覆盖回硬盘。

具体的实现方式分为两种:

方式一:

将文件内容一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件。

优点: 在文件修改过程中同一份数据只有一份
缺点: 会过多地占用内存

with open('db.txt',mode='rt',encoding='utf-8') as f:
    data=f.read()
with open('db.txt',mode='wt',encoding='utf-8') as f:
    f.write(data.replace('123'))

方式二:

以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件。删掉原文件,将临时文件重命名原文件名。

优点: 不会占用过多的内存
缺点: 在文件修改过程中同一份数据存了两份

import os
with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
        open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
    for line in read_f:
        wrife_f.write(line.replace('123'))
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')

结语

以上就是Python文件处理的基础知识,希望对大家有所帮助。 如果大家有任何疑问请给我留言,我会尽快回复大家。在此也非常感谢大家对CSDN的支持!

posted @   Hardworking666  阅读(1780)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示