yaya

今天也要加油鸭!!!

day8

# DAY8

## 复习

```
# 1.编码
'''
ASCII -> Python -> Unicode
py2: 默认ASCII | py3: 默认UTF-8
中文:GBK,兼容ASCII,只存在英文、中文与计算机识别的标识符有对应关系
编码表:人识别的标识符 与 计算机识别的标识符 形成的对应关系

各编码表中字符(人能识别)所占字节(将字符转为为二进制的中间产物)数
一个字节 = 8个二进制位 (1个十六进制位 = 4个二进制位)
ASCII:1~2个字节
Unicode:2个字节
GBK:1~2个字节
UTF-8:Unicode编码的一种体现方式,1~6个字节

Unicode定长获取信息快速,UTF-8变长传输速度快
'''


# 2.三种字符串
'''
r'原义 字\n符串'
u'最普通的字符串'

# 二进制字符串:用来传输的字符串
# 1. 是字符串(文本字符)的二进制体现,(如视频资源可以转化为二进制字符串,不翻转为视频资源,则就是普通字符串)
# 2. 二进制字符串按字节为最小存储单位存放数据
# 3. 所有数据转化为二进制字符串都应该用utf-8进行编码吗?
# -- 只是文本数据
# -- 视频、音频、图像等此类数据也有编码解码过程,采用的编码表不是utf-8,不用关系编码表

'''
s = 'ABC123'
for v in s:
# if v.isupper():
# print(v)
# if 'A' <= v <= 'Z': # 字符串比较大小的前提依据就是ASCII
# print(v)
if 65 <= ord(v) <= 90:
print(v)


# 字符与ASCII之间转化
res = ord('A')
print(res)
res = chr(65)
print(res)
# ascii:DBCS双字节存储可以存放中文等一些文字与字符,可以完成字符与整数(ascii表中整数)的转化
print(ord('⑩'), chr(9323))

# 3.文件基础读写
'''
1.打开文件
r = open('a.txt', 'r', encoding='utf-8')
w = open('a.txt', 'w', encoding='utf-8')
2.操作
r.read()
w.write('msg')
3.关闭文件
r.close()
w.close()
'''
```

## with open:将文件的释放交给with管理

```python
with open('文件', '模式', encoding='utf-8') as f:
# 操作
pass
主模式
r: 读
w: 写(无创建,有清空)
a: 追加(有创建的功能)
从模式
t: 文本操作(默认模式) r=>rt w=>wt a=>at
b: 非文本文件必须采用二进制模式来处理
+: 可读可写
r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写

x:
U:
```

## 文件模式(w,r,a)

## 主模式:w

```python
-w模式

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

## 模式r

```python
读文件
with open(file,'r',encoding='utf-8')as f:
data=read()可写字节,3bytes字节对应一个中文字符,1bytes对应一个英文或者一个阿拉伯数字
```

## a模式

```python
追加(创建功能)
with open(file,'r',encoding='utf-8')as f:
f.write('....')
# a为写模式,在原数据后追加写入新数据
with open('1.txt', 'a', encoding='utf-8') as f:
f.write('777')

```

## 文件复制(先读再写)

```python
# 需求:
# 1.完成文本类型的文件复制: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()
'''
# 将文件的关闭交给with管理,当with中逻辑结束后,系统会自动释放文件
with open('1.txt', 'r', encoding='utf-8') as r, open('source.txt', 'w', encoding='utf-8') as w:
for line in r:
w.write(line)
w.flush()
# w.close() 系统自动完成
# r.close()
# 边读边写赋值
with open('source.txt', 'r', encoding='utf-8') as f1:
with open('target.txt', 'a+', encoding='utf-8') as f2:
for line in f1:
f2.write(line)

```

## 从模式

## T模式

```python
文体操作(默认模式)mode=rt\wt\at
```

## b模式

```python
b模式无需解码,二进制
mode=rb\wb\ab\wb+\ab+\wb+\rb+
应用于存图片,视频
with open(file,mode)as f:
f.write(b('000')'如果是中文必须写二进制数 字母和阿拉伯不需要转,因为在b模式下也是一个字节表示,u模式下也是一个字节表示,(字母和阿拉伯机器可以识别,所以不用转二进制,自己识别)所以写name直接写,不用写二进制,而阿拉伯数字也是一个字节表示,打印出来显示是十六进制,而字母和数字的十六进制就是直接能看懂的')
```

## +模式(一般不用)

```python
可读可写
mode='r+'\'w+'\'a+'
r+:不创建文件
w+:创建文件
a+:创建不清空文件
```

 

## 了解

```python
# x:写模式,创建文件,如果文件以存在,就抛异常
with open('000.txt', 'x', encoding='utf-8') as f:
pass

```

## 指针移动

```python
'''
百度网盘 - 秒传
'''
'''
1. 如何使用游标:游标的相关方法
2. 游标相关的读写操作
3. 根据游标在大文件中取出多个指定位置的部分字节内容
'''

'''
seek(偏移量, 偏移位置)
偏移位置:
0 -- 文件开头(指针向后偏移,读取数据一直是指针到文件的末尾)
1 -- 当前位置(指针会向前或者向后偏移,如果偏移量是负数的话就会向前(指针的位置向后读取数据,只是指针向前罢了,读数据是往后),不是负值的话就是指针向后)
2 -- 文件末尾(指针向前偏移,读取数据一直是指针到文件的开头)
'''

# 方法:seek(偏移量, 偏移位置)
# 偏移量:移动的字节数,负数是结合模式1,2往前偏移
# 偏移位置:
# -- 0 - 从文件开始位置开始偏移 | 1 - 从当前游标位置开始偏移 | 2 - 从文件末尾开始偏移
# b'你好1234567890'

# 游标读
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')

print("-------------------------------------")
# 案例
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('慢慢传去吧')
```

 

posted @ 2019-04-01 16:15  Tiffany'.'  阅读(156)  评论(0编辑  收藏  举报