文件打开模式 读写方式,指针移动
1.文件打开模式
分为1.控制文件读写内容 :
t:(默认)以字符串为单位,必须指定encoding参数 操作文本的
b:无论读写都是以bytes为单位也就是二进制,不需要指定encoding参数, 操作图片视频等也可以操作文本,@但是读取操作需要指定decode,@写入操作需要encode 字符编码
读操作需要把数据在硬盘拿出来解码
写操作需要把数据存进去 前提需要编码
f.read().decode('utf-8') 如果读操作read后面直接调用decode指定解码格式
f.write('sss'.encode('utf-8')) 如果写操作write里面直接点encode调用编码格式
2.控制文件读写操作
r 只读 ;
w 只写 覆盖掉之前的 ;
a 追加写 在之前的内容下写 ;
2.可读可写模式 了解知识
with open('a.txt',mode='r+t',encoding='utf-8') as f:
f.write('h')
具备了写入的功能 可以调用write 了解就可以 可以不会 不可以不知道 第二次写入h会乱码 因为之前是
在硬盘里一个汉字三个字节 而一个h一个字节所以写入会出问题 结果为h��卧哈哈哈 少了两个字节
3.修改文件的两种方式
1.分别为全部读取到内存然后统一修改 对内存有要求 一次读入内存需要内存足够大
2.一行一行读取用for循环的方式,这个方式会在硬盘创建一个新的swp隐藏文档,然后修改完吧之前的删除,新的改名 对硬盘有要求有剩余足够的空间
with open('b.txt',mode='rt',encoding='utf-8') as f1:
data = f1.read()
res = data.replace('egon','EGON')
with open('b.txt',mode='wt',encoding='utf-8') as f2:
f2.write(res)
import os
with open('b.txt',mode='rt',encoding='utf-8') as f1,open('.b.txt.swp',mode='wt',encoding='utf-8') as f2:
for line in f1:
f2.write(line.replace('EGON','egon'))
os.remove('b.txt')
os.rename('.b.txt.swp','b.txt')
4.练习
inp_username=input('请输入账号')
inp_pwd=input('请输入密码')
inp_money=input('请输入初始金额')
with open('a.txt',mode='at',encoding='utf-8')as f1:
temp='%s:%s:%s\n' %(inp_username,inp_pwd,inp_money)
f1.write(temp)
print('注册成功')
zhang:123:1000.0
zhu:456:1000
gou:789:1000
lv:666:1000.0
import os
transfer_x = input("请输入转账人")
transfer_y = input("请输入接收方")
transfer_z = input("请输入转账金额")
with open('a.txt', mode='rt', encoding='utf-8')as f1, open('.a.txt.swp', mode='wt', encoding='utf-8')as f2:
for line in f1:
username, pwd, money = line.strip('\n').split(':')
if username == transfer_x:
money = float(money) - float(transfer_z)
if username == transfer_y:
money = float(money) + float(transfer_z)
temp = '%s:%s:%s\n' % (username, pwd, money)
f2.write(temp)
os.remove('a.txt')
os.rename('.a.txt.swp', 'a.txt')
zhang:123:900.0
zhu:456:900.0
gou:789:1100.0
lv:666:1100.0
5.文件读写的其他方式
with open('b.txt',mode='rt',encoding='utf-8') as f:
print(f.readable())
print(f.readline())
lines = f1.readlines()
print(lines[1])
with open('b.txt', mode='wt', encoding='utf-8') as f:
print(f.writable())
lines = ['你好\n', '我好\n', '大家好\n']
f.writelines(lines)
f.writelines('hello')
f.flush()
with open('b.txt', mode='at', encoding='utf-8') as f:
f.truncate(3)
6.控制文件指针移动
t模式下的read(n)可以指定读取的字符,字符可以使汉字可以使英文 n==个数
除此以为都是字节数
一个汉字三个字节 一个英文一个字节
f.seek(移动的字节个数,模式)
模式
0:参照文件开头 只能在t模式下使用 b.txt=我是安徽省豆你玩吗
with open('b.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0)
f.seek(6,0)
print(f.tell())
print(f.read())
1:参照指针目前位置 只能在b模式下使用
with open('b.txt',mode='rb') as f:
f.seek(3,1)
f.seek(6,1)
print(f.tell())
print(f.read().decode('utf-8'))
2:参照文件末尾 只能在b模式下使用
with open('b.txt',mode='rb') as f:
f.seek(-5,2)
f.seek(-8,2)
print(f.tell())
print(f.read().decode('utf-8'))