ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python全栈开发 day8 八、文件操作模式、文件的复制与文件游标操作

2019-03-28 15:48:04  阅读:222  来源: 互联网

标签:文件 utf day8 read open 游标 print txt seek


一、文件操作

1、wr模式结合

w = open('1.txt', 'w', encoding='utf-8')  # w:没有文件新建文件,有文件就清空文件
w.write('000\n')
w.flush()    # 在写入大量数据,要及时处理内存空间,不然内存可能溢出导致数据丢失
w.write('111\n')
w.flush()                           # 最后一次flush()操作可以省略
w.writelines(['222\n', '333\n'])  # 一次性写入多行
w.write('444')
w.write('555')
w.close()    # 1.将内存的的数据刷新到硬盘中;2.释放文件资源

②案例

# 需求:
# 完成文本类型的文件复制:1.txt => 11.txt

r = open('1.txt', 'r', encoding='utf-8')
w = open('11.txt', 'w', encoding='utf-8')
for line in r:    # 遍历就是一行一行读 取读文件的流
    w.write(line)
    w.flush()
w.close()
r.close()

 

2、文件操作模式

①主模式:

r 读           r+:不会创建文件的可读可写

w 写                        w+:创建清空文件的可读可写

a 追加                     a+:创建不清空文件的可读可写

 

②从模式:

t 文本操作(默认模式),要规定文本的编码格式utf-8

b 飞文本文件必须采用二进制模式处理,不需要规定文本的编码格式。

+ 可读可写

x 写,必须有自己的文件,否则会报错

 

③a为写模式,在原数据后追加写入新数据(追加写入)

# temp.txt
# 111222333

with open('temp.txt', 'a', encoding='utf-8') as f:
    f.write('new msg')
    
# 结果为:111222333new msg

 

 

3、文件的复制:就是先读后写

①文本类型文件的复制

rw模式:

r = open('1.txt', 'r', encoding='utf-8')
w = open('11.txt', 'w', encoding='utf-8')
for line in r:  # 遍历就是一行一行读 取读文件的流
    w.write(line)
    w.flush()
w.close()
r.close()

 

②with open完成文本文件的复制:边读边写。(with open 将文件的释放交给with管理,当with中逻辑结束后,系统自动释放文件)

with open('souurce.txt','r',encoding='utf-8') as f1:
        with open('target.txt','a+',encoding='utf-8') as f2:
                for line in f1:
                     f2.write(line)

 

③非文本文件的复制:从模式采用b模式,不需要关心编码问题

案例:复制source.mp4为target.mp4

with open('source.mp4', 'rb') as f1:
         with open('target.mp4', 'wb') as f2:
                for line in f1:
                     f2.write(line)

 

 

二、游标操作

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

1、游标方法:seek(偏移量,偏移位置)

偏移量:移动的字节数

偏移位置:

1——从当前游标位置开始偏移

0——从文件开始位置开始偏移

2——从文件末尾开始偏移

2、游标的读写操作

# 游标读
with open('source.txt', 'rb') as f:
    d1 = f.read(11)
    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
# 游标写:会覆盖书写

with open('source.txt', 'rb+') as f:
    f.seek(11)
    print(f.read())
    f.write(b'000')

 

3、案例

# 案例
with open('001.png', 'rb') as f:
    data = f.read()
print(len(data))

# 在大文件中,开头| 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)

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('慢慢传去吧')

 





标签:文件,utf,day8,read,open,游标,print,txt,seek
来源: https://www.cnblogs.com/zhangguosheng1121/p/10615455.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有