文件的操作

文件读写模式

  • 只读模式(r)

    只读模式用于打开文件但只能读取内容,不能进行编写

文件路径若不存在则会报错,路径存在则读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # run:生活就像海洋,只有意志坚定的人才能到达彼岸
  • 只写模式(w)

只写模式用于编写文件内容,但无法读取编写文件内容

文件路径若不存在,程序会自动创建这个路径文件,在新文件里添加新的内容
with open(r'b.txt', 'w', encoding= 'utf8') as f:
    f.write('阿瓦达索命')
with open(r'b.txt', 'r', encoding='utf8') as f:
    print(f.read())  # run:阿瓦达索命

文件路径若存在,程序会自动清空该文件,在将新内容输入文件(使用'w'模式时要小心,确认文件内没有重要数据)
with open(r'b.txt', 'w', encoding= 'utf8') as f:
    f.write('阿瓦达索命')
with open(r'b.txt', 'r', encoding='utf8') as f:
    print(f.read())  # run:阿瓦达索命
  • 只追加模式

只追加模式只会在文件内容的末尾添加新的内容,同样无法读取文件内容

文件路径若不存在,程序会自动创建这个路径文件,然后在新文件里添加新的内容
with open(r'c.txt', 'a', encoding='utf8') as f:
    f.write('阿瓦达索命')

文件路径若存在,程序会在文件内容的末尾添加新的内容
with open(r'c.txt', 'a', encoding='utf8') as f:
    f.write('阿瓦达索命')
with open(r'c.txt', 'r', encoding='utf8') as f:
    print(f.read())  # run:阿瓦达索命阿瓦达索命

文件的操作模式

  • 文本模式
1.文本模式是默认模式,我们使用时可以直接用简写:
简写    全写    模式
r       rt     只读
w       wt     只写
a       at     只追加

2.文本模式只能操作文件
必须指定encoding参数
读写只能用字符串类型
  • 二进制模式
1.二进制模式不是默认模式,我们使用时需要写全:
全写     模式
rb      只读
wb      只写
ab      只追加

2.可以操作各种类型的文件
不需要指定encoding参数
读写都以bytes为单位

文件的操作方法

  • read()

    一次性读取文件,读完后会将光标停留在末尾,继续读则是空

    如果文件太大不推荐用这种方法,内存顶不住

with open(r'c.txt', 'r', encoding='utf8') as f:
    print(f.read())
'''run:
阿瓦达索命
阿瓦达索命
阿瓦达索命'''
  • readline()

    一次读一行内容

with open(r'c.txt', 'r', encoding='utf8') as f:
    print(f.readline())  # run:阿瓦达索命
  • readlines()

    按行的方式一次性读取,并组成列表返回

with open(r'c.txt', 'r', encoding='utf8') as f:
    print(f.readlines())  # run:['阿瓦达索命\n', '阿瓦达索命\n', '阿瓦达索命']
  • readable()

    判断当前文件是否可读

with open(r'c.txt', 'r', encoding='utf8') as f:
    print(f.readable())  # run:True
with open(r'c.txt', 'a', encoding='utf8') as f:
    print(f.readable())  # run:False
  • writable()

    判断当前文件是否可写

with open(r'c.txt', 'r', encoding='utf8') as f:
    print(f.writable())  # run:False
with open(r'c.txt', 'a', encoding='utf8') as f:
    print(f.writable())  # run:True
  • write()

    填写要输入文件的内容

with open(r'a.txt', 'a', encoding='utf8') as f:
    f.write('阿瓦达索命')
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # run:阿瓦达索命
  • writelines()

    支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值

  • flush()

    将内存中的文件数据储存到硬盘(相当于按ctrl+s)

作业1

id1 = input('要从哪里拷贝>>>:').strip()  # 输入拷贝源路径
with open(id1, 'rb') as f:
    data = f.read()  # 将内容取出
id2 = input('要拷贝到哪里去>>>:').strip()  # 输入目标路径
with open(id2, 'wb') as b:
    b.write(data)  # 将内容输入

作业2

while True:
    print('''
    注册新用户输入1
    登录账号输入2
    ''')
    func_id = input('请输入指令>>>:').strip()  # 输入指令
    if func_id == '1':
        name = input('请输入用户名>>>:').strip()
        password = input('请输入密码>>>:').strip()
        with open(r'c.txt', 'r', encoding='utf8') as a:
            data1 = a.read()  # 将文件内容取出
            if name in data1:  # 判断输入的新用户是否以存在于文件中
                print('用户名已存在')
                continue  # 用户名以存在则重新输入
            data = f'{name}|{password}\n'  # 不存在则将新用户名字密码组合
            with open(r'c.txt', 'a', encoding='utf8') as f:
                f.write(data)  # 将新用户信息输入文件中
    elif func_id == '2':
        name2 = input('请输入用户名>>>:').strip()
        password2 = input('请输入密码>>>:').strip()
        with open(r'c.txt', 'r', encoding='utf8') as b:  # 将文件内容取出
            for i in b:  # 将文件内容以用户信息组依次循环
                name_info, password_info = i.split('|')  # 将用户信息组的用户名好密码分开赋值
                if name2 in name_info and password2 in password_info:  # 判断输入的用户名好密码在不在文件内容中
                    print(f'欢迎{name2}登录!')  # 在则登录成功
                    break
            else:
                print('账号或密码错误')  # 不在则提示错误
                continue
    else:
        print('指令错误')  # 提示指令错误
posted @ 2022-06-29 22:10  无言以对啊  阅读(143)  评论(0)    收藏  举报