文件处理

文件操作的作用就是 把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,python提供了 open 关键字来处理 文件的读写。
语法

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file参数代表文件名, 如果不带上路径的话,会在当前文件夹里查找, 而 mode参数代表文件的打开模式 ,有如下表所示的几种打开模式

基本流程

# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f 

f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r  
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作

data=f.read() 

# 3. 向操作系统发起关闭文件的请求,回收系统资源 
f.close()

with上下文管理
每次打开文件处理完之后都要 手动关闭文件 ,这样就显得比较繁琐,python 提供给了 with 关键字来帮我们自动关闭文件

with open('a.text', 'r', encoding='utf-8') as f:
    data = f.read()
    print(data)

字符集编码

,如果打开的是文本文件,会涉及到字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
f = open('a.txt','r',encoding='utf-8')

操作文件模式

模式 作用
r 只读模式打开,默认
w 写模式打开,若文件存在,先删除,然后重新创建
a 追加模式打开,追加到文件末尾,seek()指向其他地方也没用,文件不存在,自动创建
b 二进制模式打开
t 文本模式打开,默认
+ 可读写模式,可配合其他模式使用,比如r+,w+
x 如果文件已存在,用此模式打开会引发异常
U 通用换行符支持
inp_name = input('请输入用户名: ').strip()
inp_pwd = input('请输入密码: ').strip()
with open(r'db.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('账号名或者密码错误')
with open('b.txt', mode='w', encoding='utf-8') as f:
    f.write('你好\n')
    f.write('我好\n')
    f.write('大家好\n')
    f.write('111\n222\n333\n')
# 强调:
# 1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
# 2 如果重新以w模式打开文件,则会清空文件内容
# a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
with open('c.txt', mode='a', encoding='utf-8') as f:
    f.write('44444\n')
    f.write('55555\n')
    # 强调 w 模式与 a 模式的异同:
    # 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
    # 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后

操作文件的方法

# 读操作
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)

# 写操作
f.write('1111\n222\n')  # 针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8'))  # 针对b模式的写,需要自己写换行符
f.writelines(['333\n', '444\n'])  # 文件模式
f.writelines([bytes('333\n', encoding='utf-8'), '444\n'.encode('utf-8')])  # b模式

其他操作

f.readable() 
# 文件是否可读 
f.writable() 
# 文件是否可读 
f.closed 
# 文件是否关闭 
f.encoding 
# 如果文件打开模式为b,则没有该属性
f.flush() 
# 立刻将文件内容从内存刷到硬盘 

无常
21 声望0 粉丝