day20

文件处理

什么是文件处理

修改存储的信息

什么是文件

操作系统提供的虚拟概念,存储信息(用二进制存储信息)

操作文件的流程

打开文件

①文件路径②打开模式,w--》write③

f = open(r'C:\Users\qndn\PycharmProjects\untitled4\day20\01 文件处理.py','w',encoding='utf8')

修改/读取文件

f.write('''
孩儿立志出湘关,学不成名誓不还
埋骨何须桑梓地,人生无处不青山
''')

保存文件

f.flush() # 快速保存,你可以不适用

关闭文件

f.close()

文件的三种打开模式

读取/清空写入/追加写入

读取

rt --》read_text 读文本内容 只读

f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'rt', encoding='utf8')
f.write('slkdjfklj')
data = f.read()
print(data)
print(f.readable()) # 判断是否可读
print(f.writable()) # 判断是否可写


data = f.read()  # 读取所有文本内容
print(data)

# 仅作了解
# print(f.readline())  # 一行一行读取
# print(f.readlines())  # 读取所有行放入列表  # 一筐鸡蛋
# for i in f.read():  # 循环出一个个字符
#     print(i)
# for i in f:  # 循环出一行行 # 节省内存  # 老母鸡下蛋
#     print(i)
# 文本读一行少一行,每一行末尾默认有一个换行
# for i in f:
#     print(i)

清空写入

wt:只写(w空空文件后写入),不可读

# 仅作了解
# f.writelines(['abc', 'edf', 'gbk'])  # 自动拼接列表元素,一行写入

追加写入

at:只写入

打开文件的两种方式

t-->文本;b-->二进制模式:这两种东西不单独使用,一般与r/w/a联用,不需要coding

b模式一般用于图片/音频/视频的保存

w和a模式可以自动创建文件

绝对路径和相对路径

文件的路径

文件在硬盘的地址

绝对路径

从盘符开始 D:\

相对路径

执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下

项目尽量用相对路径

with管理文件上下文

with提供一个自动关闭文件(解除了操作系统的占用)

with open('test.py', 'r', encoding='utf8') as f:
    #在这个缩进下不会关闭文件,在这个缩进下对文件操作
    data = f.read()

print(data)
# 关闭文件(操作系统),没有关闭python、内存中的文件
print(f) # 只涉及python
# print(f.read()) # 设计操作系统,报错

文件的高级应用

全部仅作了解

三种新的方式(可读又可写),尽量不要使用

可写可读 r+

with open('test.py', 'r+', encoding='utf8') as fr:
    # print(fr.readable())
    # print(fr.writable())
    fr.write('高级')  # 光标在文件头部,覆盖后面的字符

可写可读 w+

和 w 没有任何区别

with open('test.py', 'w+', encoding='utf8') as fw:
    print(fw.readable())
    print(fw.writable())

可写可读 a+

a模式默认光标在尾部

with open('test.py','a+',encoding='utf8') as fw:
    print(fw.readable())
    print(fw.writable())
    fw.seek(0,0)
    print(fw.read())

需要了解的

8个二进制位为一个字节,3个8进制位组成一个字符(针对中文,英文是一个字节一个字符)

seek

with open('test.py', 'rb') as fr:
    fr.seek(5)  # 移动了3个字节,一个中文,默认从开头开始
    print(fr.read())
    print(fr.read().decode('utf8'))

whence

规定只有0,1,2三种模式 # 0相当于文件头开始;1相当于当前文件所在位置;相当于文件末尾

    fr.seek(3, 0)  # 0从开头
    # print(fr.read().decode('utf8'))
    fr.seek(3, 1)
    print(fr.read().decode('utf8'))
    fr.seek(0, 2)
    print(fr.read())

tell

告诉你当前所在的位置

with open('test.py', 'rb') as fr:
    fr.seek(3, 0)
    print(fr.tell())

truncate

截断

with open('test.py', 'ab') as fa:
    fa.truncate(2)

read

移动光标(以字符为单位)

with open('test.py', 'r', encoding='utf8') as fr:
    print(fr.read(3))  # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字

登录注册

注册

count = 0
while count < 3:
    username_inp = input('请输入你的用户名:')
    pwd_inp = input('请输入你的密码:')
    re_pwd_inp = input('请在此输入你的密码:')

    if not pwd_inp == re_pwd_inp:
        print('两次密码输入不一致')
        count += 1
        continue

    with open('user_info.txt', 'a', encoding='utf8') as fa:
        fa.write(f'{username_inp}:{pwd_inp}\n')  # :表示用户名和密码的分割;|用户和用户之间的分割
        fa.flush()
        break

登录

username_inp = input('请输入你的用户名:')
pwd_inp = input('请输入你的密码:')

with open('user_info.txt', 'r', encoding='utf8') as fr:
    for user_info in fr:
        username, pwd = user_info.split(':')

        if username.strip() == username_inp and pwd.strip() == pwd_inp:  # strip可以去掉两端的换行符
            print('登录成功')
            break
        # else:
        #     continue  # continue一般不写在最后一行
    else:
        print('登录失败')

文件的修改

文件其实没有修改一说,只有覆盖

posted @ 2019-09-18 21:16  Isayama  阅读(119)  评论(0编辑  收藏  举报