文件打开模式 读写方式,指针移动

文件打开模式 读写方式,指针移动

1.文件打开模式

分为1.控制文件读写内容    :
t:(默认)以字符串为单位,必须指定encoding参数     操作文本的    
b:无论读写都是以bytes为单位也就是二进制,不需要指定encoding参数,      操作图片视频等也可以操作文本,@但是读取操作需要指定decode,@写入操作需要encode 字符编码
    读操作需要把数据在硬盘拿出来解码
    写操作需要把数据存进去 前提需要编码
#ps:如果用b就没有encoding  在分是读操作还是写操作,读操作要解码decode,,,写操作要encode编码   
#如果有t必须有encoding    不熟需要记住   b模式如下
    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('次卧')
    f.write('h')
    
具备了写入的功能 可以调用write 了解就可以  可以不会 不可以不知道   第二次写入h会乱码  因为之前是
#次卧哈哈哈
在硬盘里一个汉字三个字节   而一个h一个字节所以写入会出问题   结果为h��卧哈哈哈     少了两个字节

3.修改文件的两种方式

1.分别为全部读取到内存然后统一修改    对内存有要求 一次读入内存需要内存足够大
2.一行一行读取用for循环的方式,这个方式会在硬盘创建一个新的swp隐藏文档,然后修改完吧之前的删除,新的改名   对硬盘有要求有剩余足够的空间

# 思路一:
 with open('b.txt',mode='rt',encoding='utf-8') as f1:     #打开b.txt只读方式打开
     data = f1.read()             #f1.read   全部读取到内存
     res = data.replace('egon','EGON')   #.在内存统一修改然后自动关闭

 with open('b.txt',mode='wt',encoding='utf-8') as f2:    #再打开b.txt
     f2.write(res)                         #之前获取的res写入到b.txt


# 思路二
import os
# 打开b.txt  然后新建一个隐藏文档,f1的一行一行循环到f2.write里面
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')     #删除之前的 所以对硬盘要求有足够的空间建两个  把之前的全部复制到新的一份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())        #判断是不是只读  返回True orFalse
    print(f.readline())         #读取一行数据
    lines = f1.readlines()    # 读取数据返回一个列表,通过索引可以调取第几行
    print(lines[1])
    
with open('b.txt', mode='wt', encoding='utf-8') as f:
	print(f.writable())       #判断是不是只写  True
    lines = ['你好\n', '我好\n', '大家好\n']
    f.writelines(lines)            #通过循环的方式吧lines的值一行一行存入进去
    f.writelines('hello')          #其实存了五遍 h,e,e,l,l,o 
    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)    #最左面移动3字节  3
     f.seek(6,0)    #又回到开头移动6个字节  6
     print(f.tell())   #当前指针位置  6  
     print(f.read())   #安徽省豆你玩吗
1:参照指针目前位置 只能在b模式下使用
with open('b.txt',mode='rb') as f:
     f.seek(3,1)               #移动三个
     f.seek(6,1)               #在移动6个总共移动九个
     print(f.tell())           #9
	 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'))  #输出从左向右
    
posted @ 2021-08-05 17:09  迪迦张  阅读(91)  评论(0编辑  收藏  举报