3.27Day06字符编码复习,文件处理模式

上节课复习
二进制字符串:用来传输的字符串
b''
1、是字符串(文本字符)的二进制体现,(入市前资源可以转化为二进制字符串,不反转为视频资源,则就是普通字符串
2、二进制字符串按字节为最小存储单位存放数据
3、所有数据转化为二进制字符串都应该用utf-8进行编码吗???
--只是文本数据用utf-8编码
--视频、音频、图像等此类数据也有编码解码的过程,用的不是utf-8,,无需考虑

字符串比较大小的前提依据就是ascii码表

# 字符与ascii之间的转化
res= ord('A')
print(res)
run ==》
65

res = chr('65')
print(res)
run ==》
'A'

ascii:DBCS 双字节存储可以存放中文的一些文字与字符,可以完成字符与整数(asicc表中整数)的转化
print(ord('⑩'),chr('9323'))
run ==》
9321 ⑪

一、文件处理
1、r w 模式结合
# w : 没有文件新建文件,有文件就清空文件
w = open ('1.txt','w',encoding='utf-8')
w.write('123')
w.flush() # 在写入大量数据时要即时处理内存空间,不然内存可能溢出导致数据丢失
w.write('456')
w.flush() # 最后一次flush操作可以省略
# 1.将村内的数据刷新到硬盘中; 2. 释放文件资源
w.close

文本类型的文件复制:先读再写
r = open('1.txt','r',encoding'utf-8')
w = open('11.txt','w',encoding'utf-8')
for line in r: # 遍历就是一行一行读取读文件的流
w.write(line)
w.close
r.close

# with open
# 将文件的关闭交给with管理,当with中逻辑结束后,系统会自动释放文件
with open() as f:
with open('1.txt', 'r', endoding='utf-8') as r, open('111.txt', 'w', endoding='utf-8') as 'w':
for line in r:
w.write(line)
w.flush()
w.close # 系统自动操作
r.close # 系统自动操作

2、文件操作模式
r:读
w:写(无创建,有清空)
a:追加(有创建的功能)

t:按字符操作
b:非文本文件必须采用二进制模式来处理
+:可读可写
r+:不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建并且不清空文件

r+:二进制读 | wb:创建清空文件的二进制写 | ab:创建不清空文件(追加)的二进制写
rb+ | wb+ | ab+

x:写模式;创建文件,如果文件已存在,就报错
u:

# 借助读写,完成追加 (麻烦)
with open('1.txt', 'rt', encoding='utf-8') as f1:
data = f1.read()
data += '666'
with open('1.txt', 'wt', encoding='utf-8') as f2:
f2.write(data)

# a为写模式,在数据后追加写入新数据
with open('1.txt', 'a', encoding='utf-8') as f:
f.write('777')

3、with完成文本文件的复制
with open('source.txt', 'r', encoding='utf-8') as f1, \
open('target.txt', 'a', encoding='utf-8') as f2:
# 读取一个字节,如果是行/文件等结束标识,就返回该标识,否则返回None
print(f1.newlines)

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)

# 边读边写复制
with open('F:\代码文档\文件\day8\边读边写复制文件.txt', 'r+', encoding='utf-8') as f1:
with open('F:\代码文档\文件\day8\边读边写复制文件1.txt', 'a+', encoding='utf-8') as f2:
for i in f1:
f2.write(i)
f2.flush()


4、非文本文件复制
从模式采用 b 模式,不需要关心编码问题
with open('F:\代码文档\文件\day8\\测试.png', 'rb') as r, \
open('F:\代码文档\文件\day8\\测试1.png', 'wb') as w:
data_r = r.read()
w.write(data_r)


5、游标:必须在 b 模式下操作,seek中偏移的是字节
5.1 游标的相关方法
方法: seek (偏移量,偏移位置)
偏移量:移动的字节数
偏移位置:
0 :从文件开始位置开始偏移 | 1:从当前游标位置开始偏移 | 2:从文件末尾开始偏移

5.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')

5.3 根据游标在大文件中取出多个指定位置的部分字节内容
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('慢慢传去吧')
posted @ 2019-03-27 14:34  输诚  阅读(118)  评论(0编辑  收藏  举报