pytthon—day8 读写模式的结合

2020-01-16 11:04:37 浏览数 (1)

一、读写模式的结合

w:写指没有新建文件,有文件就清空

代码语言:javascript复制
w=open('1.txt','w',encoding='utf-8')
w.write('000n')
在写入数据时,需要及时处理内存空间,不然内存溢出到值数据丢失
w.flush()
w.write('222n')
最后一次flush()刷新操作可以省略
w.flush()
w.close()

1、将内存的数据刷新到硬盘中 2、释放文件资源 可以一次性写多行 n:指换行 w.writelines(['1111n','33333n']) 需求:

代码语言:javascript复制
1、完成文本文件类型的文件复制:1.txt》》》11.txt

r=open('1.txt','r',encoding='utf-8')
w=open('11.txt','r',encoding='utf-8')
for line in r:
    w.write(line)
    w.flush()
w.close()
r.close()
代码语言:javascript复制
代码语言:javascript复制
2、将文件的关闭交给with管理,当with逻辑结束后,系统会自动释放文件
with open('1.txt','r',encoding='utf-8') as r,open('11.txt','w',encoding='utf-8')as w:
 for line in r :
    w.write(line)
    w.flush()
# w.close()  r.close()系统(with   open)自动运行完成,自动忽略

二、文件操作模式

r=读 w=写,无创建有清空 a=追加 有创建无清空 t=文本操作(默认模式)》》at wt rt =可读可写 r :不会创建文件的可读可写 w :创建文件/清空的可读可写 a :创建文件不清空文件的可读可写 b=非文本文件必须采用二进制的模式处理 rb: 二进制读 | wb:创建清空文件的二进制写 | ab: 创建不清空文件(追加)的二进制写 rb | wb | ab x=创建文件,如果文件已存在就抛异常,属于写模式

代码语言:javascript复制
with open('1.txt','wt',encoding= 'utf-8') as f:
    f.write('666')
借助读写,完成追加
代码语言:javascript复制
方法一(复杂版)
with open('1.txt','rt',encoding= 'utf-8') as f1:
    data=f1.read()
    data ='6666'
with open('1.txt','wt',encoding= 'utf-8') as f2:
    f2.write(data)
代码语言:javascript复制
方法二(简单版)
with open('1.txt','rt',encoding= 'utf-8') as f:
    f.write('6666')
代码语言:javascript复制
代码语言:javascript复制
x:写模式,创建文件,如果文件以存在,就抛异常
with open('000.txt', 'x', encoding='utf-8') as f:
    pass
代码语言:javascript复制

三、with完成文本文件复制

文件的复制:就是先读后写 1、文本类型文件的复制

代码语言:javascript复制
先读后写
with open('source.txt', 'r', encoding='utf-8') as f1, 
    open('target.txt', 'a', encoding='utf-8') as f2:
          ''' 
           读取一个字节,如果是行/文件等结束标识,就返回该标识,否则返回None
          '''
print(f1.newlines) # 》》》》添加是返回值none

first_data = f1.read(9)
f2.write(first_data)
f2.flush()  # 》》》》》读取的是第一行

print(f1.newlines) # 》》》》最后一个字节是空返回空值

second_data = f1.readline()
f2.write(second_data)
f2.flush()

last_data = f1.read()
f2.write(last_data)
f2.flush()

print(f1.newlines)
data = f1.read()
print(data)

2、用with open语法如何处理?

代码语言:javascript复制
边读边写
with open('source.txt', 'r', encoding='utf-8') as f1:
    with open('target.txt', 'r', encoding='utf-8') as f2:
        for line in f1:
            f2.write(line)
代码语言:javascript复制

3、如果复制非文本类型的数据文件?

代码语言:javascript复制
with open('333.mp4', 'rb') as f1:
    with open('666.mp4', 'wb ') as f2:
        for line in f1:
            f2.write(line)
代码语言:javascript复制

四、游标操作

游标:必须在b模式下操作,seek中偏移的是字节

如 百度网盘——秒传 1、如何使用游标,游标的相关方法 方法:seek 偏移量:移动的字节数,负数是结合1,2位置往前偏移 偏移位置:0:代表游标移至文件/数据的开头                 1代表:当前游标的位置开始偏移                 2:代表:从文件末尾开始偏移 2、游标相关的读写操作

代码语言:javascript复制
b'你好1234567890'
# 游标读
with open('source.txt','rt',encoding='utf-8')as f:
    d1=f.read()
    print(d1)
    f.seek(0,0) # 游标操作——从头开始
    d2=f.read()
    print(d2)

# 游标读
with open('source.txt', 'rb') as f:
    d1 = f.read()
    print(d1)
    # print(d1.decode('utf-8'))#  》》》解码的过程,不加则输出为二进制的数据

    当前游标的位置
    print(f.tell())

    游标操作 - 从末尾位置开始
    f.seek(-3, 2)
    d2 = f.read()
    print(d2.decode('utf-8'))  # 890

    游标操作 - 从当前位置开始
    f.seek(-3, 1)
    d2 = f.read()
    print(d2.decode('utf-8'))  # 34567890

    游标操作 - 从头开始
    f.seek(3, 0)
    d2 = f.read()
    print(d2)
    print(d2.decode('utf-8'))  # 好1234567890
代码语言:javascript复制
代码语言:javascript复制
游标写:会覆盖书写
with open('source.txt', 'rb ') as f:
    f.seek(11)
    # print(f.read())
    f.write(b'000')
代码语言:javascript复制
代码语言:javascript复制
案例
with open('001.png', 'rb') as f:
    data = f.read()
print(len(data))

3、根据游标在大文件中取出多个指定位置的部分字节内容

代码语言:javascript复制
在大文件中,开头| 1/3 | 2/3 | 末尾 各取10个字节拼接成秒传的信息依据
形成秒传规则
tagData = b''
with open('001.png', 'rb') as f:
    通过其他途径(sys模块)来获取文件总大小
    data = f.read()
    length = len(data)
    开头
    f.seek(0, 0)
    d1 = f.read(10)
    # 1/3
    f.seek(length // 3, 0)
    d2 = f.read(10)
    # 2/3
    f.seek(length // 3 * 2, 0)
    d3 = f.read(10)
    末尾
    f.seek(-10, 2)
    d4 = f.read(10)
    tagData = d1   d2   d3   d4
秒传依据
print(tagData)
代码语言:javascript复制
newData = b""
with open('001.png', 'rb') as f:
    data = f.read()
    length = len(data)
    f.seek(0, 0)
    newData  = f.read(10)
    f.seek(length // 3, 0)
    newData  = f.read(10)
    f.seek(length // 3 * 2, 0)
    newData  = f.read(10)
    f.seek(-10, 2)
    newData  = f.read(10)

if newData == tagData:
    print('秒传成功')
else:
    print('慢慢传去吧')
代码语言:javascript复制

0 人点赞