python全栈闯关--8-文件操作

1、打开文件open

# 1、直接打开
open('account', mode='w', encoding='utf-8')
# 2、打开赋值给一个句柄
f = open('account', mode='r', encoding='utf-8')
f.close()
# 3、使用with打开,好处是可以不使用close
with open("account", mode='r', encoding='utf-8') as f1:
    pass

 文件可以是相对路径,也可以是绝对路径

2、文件读取模式

读r、r+、rb、r+b

直接读取:

f = open('account', mode='r', encoding='utf-8')
print(f.read())
f.close()

按照字符读取:

f = open('account', mode='r', encoding='utf-8')
print(f.read(3))  # 读取字符读取,读取3个字符b
f.close()

使用rb模式读取

f = open('account', mode='rb')  # 按照bytes读取,不需要指定字符集编码
print(f.read())  # 执行结果为bytes类型
f.seek(0)  # 跳到行首
print(f.read().decode('utf-8'))  # bytes转换为utf-8 使用decode
f.close()

rb模式读取到结果为bytes格式

bytes准换为字符串decode('格式')

字符串转换成bytes使用encode('格式'),如果是英文,可以使用b'berr'方式转换,包含中午必须使用encode

 

f = open('account', mode='r+', encoding='utf-8')
print(f.read())
f.write('this is bee honey')  # 先读,后写。读取到哪个位置,在哪个位置继续写
f.close()

f = open('account', mode='r+b')
print(f.read().decode('utf-8'))
f.write("write test\n".encode('utf-8'))  # 如果不进行编码,会报错:TypeError: a bytes-like object is required, not 'str'
f.writelines(['this is bee honey'.encode('utf-8'),
              '\nsecond line'.encode('utf-8')])
f.close()

 

 

 

读w、wb、w+、w+b

w模式

f = open('account', mode='w', encoding='utf-8')  # 写模式都是删除后,重新写入,不会在原有基础上添加
f.write('honey bee \n')
f.write(" bear big !\n")
f.write("beear two!")
f.close()

wb模式

f = open('account', mode='wb')  # 写模式都是删除后,重新写入,不会在原有基础上添加
f.write('honey bee \n'.encode('utf-8'))  # 需要写入的为bytes类型,否则报错
f.write(b" bear big !\n")  # b转换成bytes模式
f.close()

 

w+

f = open('account', mode='w+', encoding='utf-8')  # 写模式都是删除后,重新写入,不会在原有基础上添加
f.write('honey bee \n')  
f.write(" bear big !")  
f.seek(0)  # 指向文件开头,从头读取文件
print(f.read())
f.close()

w+和r+都是同时读和同时写,r+先读后写,不覆盖原始文件。w+直接删除原文件后,才进行写入,导致w+模式不常用,一般使用r+模式

f = open('account', mode='w+b')  # 写模式都是删除后,重新写入,不会在原有基础上添加
print(f.read())
f.write('honey bee \n'.encode('utf-8'))
f.write(" bear big !".encode('utf-8'))
f.seek(0)  # 指向文件开头,从头读取文件
print(f.read())
f.close()

追加 a、a+、ab、a+b

a模式,只能在文件结尾追加,但是不能读取

f = open('account', mode='a')  # 追加模式,文件结尾直接追加
# 只能写,不能读取
f.write('honey bee \n')
f.write(" bear big !")
f.close()

a+模式,可以读取,也可以追加

f = open('account', mode='a+')
# f.read()
f.write('honey bee \n')
f.write(" bear big !")
f.seek(0)
print(f.read())
f.close()

  ab模式,按照bytes型追加,只能追加,不能读取

f = open('account', mode='ab')
# f.read()
f.write('honey bee \n'.encode('utf-8'))
f.write(" bear big !".encode('utf-8'))
f.close()

a+b模式,可以按照bytes追加,同时可以使用seek调整位置后,读取,写入

f = open('account', mode='a+b')
f.read()
f.write('honey bee \n'.encode('utf-8'))
f.write(" bear big !".encode('utf-8'))
f.seek(0)
print(f.read())
f.close()

 

with模式,使用with模式打开文件,结束可以不必使用close函数

with open('account', 'r+', encoding='utf-8') as f:
    content = f.read()
    print(content)

 

 

练习:模拟注册、登录

username = input("请输入你的用户名:")
userpasswd = input("请输入你的密码:")

with open('account', 'w', encoding='utf-8') as f:
    f.write("{}\n{}".format(username, userpasswd))

print('注册成功!')

lis = []
try_count = 0

while try_count < 3:
    in_uname = input("请输入你的用户名:")
    in_pwd = input("请输入你的密码:")
    with open('account', encoding='utf-8') as f1:
        for line in f1:
            lis.append(line)
    if in_uname == lis[0].strip() and in_pwd == lis[1].strip():
        print("登录成功!")
        break
    else:
        print("账户或者密码错误!")
        try_count += 1

 

3、修改文件

with open("account",mode='r',encoding='utf-8') as f1,open("account.bak",mode='w',encoding='utf-8') as f2:
    for i in f1:
        if "bear" in i:
            i = i.replace('bear', 'big two')
        f2.write(i)
import os
os.remove("account")
os.rename("account.bak", "account")

 

posted @ 2019-10-05 22:10  熊熊闯深林  阅读(149)  评论(0编辑  收藏  举报