文件操作续

今日学习的内容,学习了打开文件的纯净模式,文件内光标移动的操作,以及截断文件,修改文件的操作。

r+, 读写【可读,可写】,w+,写读【可读,可写】,a+, 写读【可读,可写】
with open(r'bb.txt',mode='r+',encoding='utf-8') as f:
    print(f.readable())  # 判断是否可读
    print(f.writable())  # 判断是否可写
    print(f.readline())  # 读一行
    f.write('哈哈哈')

w+,写读【可读,可写】
with open(r'bb.txt',mode='w+',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    print(f.readline())
    f.write('哈哈哈')

with open(r'bb.txt',mode='r+b') as f:
    print(f.readable())
    print(f.writable())
    res = f.read()
    print(res.decode('utf-8'))
    res1 = str(res,encoding='utf-8')
    print(res1)

文件内光标的移动

***在rt模式下 read内的数字 表示的是字符的个数,除此之外,数字表示的都是字节

with open(r'test','rt',encoding='utf-8') as f:
    print(f.read(5))  # 文本文件中,read读出了五个字符

with open(r'test','rb') as f:
    res = f.read(10)  # 读的是三个字节bytes
    print(res)
    print(res.decode('utf-8'))

文件光标移动s.seek(offset,whence)

offset:相对偏移量 光标移动的位数
whence:
0:参照文件的开头 t和b都可以使用
1:参照光标所在的当前位置 只能在b模式下用
2:参照文件的末尾 只能在b模式下使用

0模式,参照位置是文件的开头  t和b都可以使用
with open(r'test','rt',encoding='utf-8') as f:
    print(f.read(1))
    f.seek(6,0)  # seek移动都是字节数
    f.seek(4,0)  # seek移动都是字节数
    print(f.read(1))
    f.seek(0,0)
    print(f.read(1))
    f.seek(0, 0)
    print(f.read(1))
    f.seek(6,0)
    print(f.read())

1模式,参照光标的当前位置  只能在b
with open(r'test','rb') as f:
    print(f.read(3).decode('utf-8'))
    f.seek(3,1)
    print(f.read(1))
    f.seek(6,0)  # seek移动都是字节数
    f.seek(4,0)  # seek移动都是字节数

2模式参照的位置是文件的末尾   只能在b
with open(r'test','rb') as f:
    print(f.read())
    f.seek(-4,2)
    print(f.read().decode('utf-8'))

截断文件

with open(r'test','a',encoding='utf-8') as f:
    f.truncate(6)  # 接收的字节的长度 整型 保留0~6字节数 后面的全部删除(截断)

修改文件

方法一

1、先将数据由硬盘读到内存(读文件)
2、在内存中完成修改(字符串的替换)
3、再覆盖原来的内容(写文件)

with open(r'cc.txt','r',encoding = 'utf-8') as f:
    data = f.read()  # 将读出的内容赋给data
    print(data)
    print(type(data))  # 类型是字符串

with open(r'cc.txt','w',encoding='utf-8') as f:
    res =data.replace('二哈','橘猫')  # 在data中将“二哈”换成“橘猫”
    print(data)  
    f.write(res)  # 将res的内容写入

优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出

方法二

1、创建一个新文件

2、循环读取老文件的内容到内存进行修改,将修改好的内容写到新的文件中

3、将老文件删除,将新文件的名字改成老文件

import os  # 调用os函数
with open(r'cc.txt','r',encoding='utf-8') as read_f,\  # 打开文件cc.txt
        open(r'cc.wsl','a',encoding ='utf-8') as write_f:  # 创建一个新文件cc.wsl
    for line in read_f:  # 循环读取cc.txt的内容
        new_line = line.replace('柯基','橘猫')  # 将line中的柯基换成橘猫
        write_f.write(new_line)  # 在新文件中写入替换之后的内容
os.remove('cc.txt')  # 删除原文件
os.rename('cc.wsl','cc.txt')  # 改名,将新文件的名字改成原文件的名字

 

posted @ 2019-07-08 17:35  云上3000  阅读(177)  评论(0)    收藏  举报