day8
# DAY8
## 復(fù)習(xí)
```
# 1.編碼
'''
ASCII -> Python -> Unicode
py2: 默認(rèn)ASCII | py3: 默認(rèn)UTF-8
中文:GBK,兼容ASCII,只存在英文、中文與計(jì)算機(jī)識(shí)別的標(biāo)識(shí)符有對(duì)應(yīng)關(guān)系
編碼表:人識(shí)別的標(biāo)識(shí)符 與 計(jì)算機(jī)識(shí)別的標(biāo)識(shí)符 形成的對(duì)應(yīng)關(guān)系
各編碼表中字符(人能識(shí)別)所占字節(jié)(將字符轉(zhuǎn)為為二進(jìn)制的中間產(chǎn)物)數(shù)
一個(gè)字節(jié) = 8個(gè)二進(jìn)制位 (1個(gè)十六進(jìn)制位 = 4個(gè)二進(jìn)制位)
ASCII:1~2個(gè)字節(jié)
Unicode:2個(gè)字節(jié)
GBK:1~2個(gè)字節(jié)
UTF-8:Unicode編碼的一種體現(xiàn)方式,1~6個(gè)字節(jié)
Unicode定長(zhǎng)獲取信息快速,UTF-8變長(zhǎng)傳輸速度快
'''
# 2.三種字符串
'''
r'原義 字\n符串'
u'最普通的字符串'
# 二進(jìn)制字符串:用來傳輸?shù)淖址?br /># 1. 是字符串(文本字符)的二進(jìn)制體現(xiàn),(如視頻資源可以轉(zhuǎn)化為二進(jìn)制字符串,不翻轉(zhuǎn)為視頻資源,則就是普通字符串)
# 2. 二進(jìn)制字符串按字節(jié)為最小存儲(chǔ)單位存放數(shù)據(jù)
# 3. 所有數(shù)據(jù)轉(zhuǎn)化為二進(jìn)制字符串都應(yīng)該用utf-8進(jìn)行編碼嗎?
# -- 只是文本數(shù)據(jù)
# -- 視頻、音頻、圖像等此類數(shù)據(jù)也有編碼解碼過程,采用的編碼表不是utf-8,不用關(guān)系編碼表
'''
s = 'ABC123'
for v in s:
# if v.isupper():
# print(v)
# if 'A' <= v <= 'Z': # 字符串比較大小的前提依據(jù)就是ASCII
# print(v)
if 65 <= ord(v) <= 90:
print(v)
# 字符與ASCII之間轉(zhuǎn)化
res = ord('A')
print(res)
res = chr(65)
print(res)
# ascii:DBCS雙字節(jié)存儲(chǔ)可以存放中文等一些文字與字符,可以完成字符與整數(shù)(ascii表中整數(shù))的轉(zhuǎn)化
print(ord('⑩'), chr(9323))
# 3.文件基礎(chǔ)讀寫
'''
1.打開文件
r = open('a.txt', 'r', encoding='utf-8')
w = open('a.txt', 'w', encoding='utf-8')
2.操作
r.read()
w.write('msg')
3.關(guān)閉文件
r.close()
w.close()
'''
```
## with open:將文件的釋放交給with管理
```python
with open('文件', '模式', encoding='utf-8') as f:
# 操作
pass
主模式
r: 讀
w: 寫(無創(chuàng)建,有清空)
a: 追加(有創(chuàng)建的功能)
從模式
t: 文本操作(默認(rèn)模式) r=>rt w=>wt a=>at
b: 非文本文件必須采用二進(jìn)制模式來處理
+: 可讀可寫
r+: 不會(huì)創(chuàng)建文件的可讀可寫 | w+:創(chuàng)建清空文件的可讀可寫 | a+:創(chuàng)建不清空文件(追加)的可讀可寫
x:
U:
```
## 文件模式(w,r,a)
## 主模式:w
```python
-w模式
# w:沒有文件新建文件,有文件就清空文件
w = open('1.txt', 'w', encoding='utf-8')
w.write('000\n')
# 在寫入大量數(shù)據(jù),要及時(shí)處理內(nèi)存空間,不然內(nèi)存可能溢出導(dǎo)致數(shù)據(jù)丟失
w.flush()
w.write('111\n')
# 最后一次flush()操作可以省略
w.flush()
# 一次性寫入多行
w.writelines(['222\n', '333\n'])
w.write('444')
# w.newlines
w.write('555')
# 1.將內(nèi)存的的數(shù)據(jù)刷新到硬盤中;2.釋放文件資源
w.close()
```
## 模式r
```python
讀文件
with open(file,'r',encoding='utf-8')as f:
data=read()可寫字節(jié),3bytes字節(jié)對(duì)應(yīng)一個(gè)中文字符,1bytes對(duì)應(yīng)一個(gè)英文或者一個(gè)阿拉伯?dāng)?shù)字
```
## a模式
```python
追加(創(chuàng)建功能)
with open(file,'r',encoding='utf-8')as f:
f.write('....')
# a為寫模式,在原數(shù)據(jù)后追加寫入新數(shù)據(jù)
with open('1.txt', 'a', encoding='utf-8') as f:
f.write('777')
```
## 文件復(fù)制(先讀再寫)
```python
# 需求:
# 1.完成文本類型的文件復(fù)制: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()
'''
# 將文件的關(guān)閉交給with管理,當(dāng)with中邏輯結(jié)束后,系統(tǒng)會(huì)自動(dòng)釋放文件
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() 系統(tǒng)自動(dòng)完成
# 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
文體操作(默認(rèn)模式)mode=rt\wt\at
```
## b模式
```python
b模式無需解碼,二進(jìn)制
mode=rb\wb\ab\wb+\ab+\wb+\rb+
應(yīng)用于存圖片,視頻
with open(file,mode)as f:
f.write(b('000')'如果是中文必須寫二進(jìn)制數(shù) 字母和阿拉伯不需要轉(zhuǎn),因?yàn)樵赽模式下也是一個(gè)字節(jié)表示,u模式下也是一個(gè)字節(jié)表示,(字母和阿拉伯機(jī)器可以識(shí)別,所以不用轉(zhuǎn)二進(jìn)制,自己識(shí)別)所以寫name直接寫,不用寫二進(jìn)制,而阿拉伯?dāng)?shù)字也是一個(gè)字節(jié)表示,打印出來顯示是十六進(jìn)制,而字母和數(shù)字的十六進(jìn)制就是直接能看懂的')
```
## +模式(一般不用)
```python
可讀可寫
mode='r+'\'w+'\'a+'
r+:不創(chuàng)建文件
w+:創(chuàng)建文件
a+:創(chuàng)建不清空文件
```
?
## 了解
```python
# x:寫模式,創(chuàng)建文件,如果文件以存在,就拋異常
with open('000.txt', 'x', encoding='utf-8') as f:
pass
```
## 指針移動(dòng)
```python
'''
百度網(wǎng)盤 - 秒傳
'''
'''
1. 如何使用游標(biāo):游標(biāo)的相關(guān)方法
2. 游標(biāo)相關(guān)的讀寫操作
3. 根據(jù)游標(biāo)在大文件中取出多個(gè)指定位置的部分字節(jié)內(nèi)容
'''
'''
seek(偏移量, 偏移位置)
偏移位置:
0 -- 文件開頭(指針向后偏移,讀取數(shù)據(jù)一直是指針到文件的末尾)
1 -- 當(dāng)前位置(指針會(huì)向前或者向后偏移,如果偏移量是負(fù)數(shù)的話就會(huì)向前(指針的位置向后讀取數(shù)據(jù),只是指針向前罷了,讀數(shù)據(jù)是往后),不是負(fù)值的話就是指針向后)
2 -- 文件末尾(指針向前偏移,讀取數(shù)據(jù)一直是指針到文件的開頭)
'''
# 方法:seek(偏移量, 偏移位置)
# 偏移量:移動(dòng)的字節(jié)數(shù),負(fù)數(shù)是結(jié)合模式1,2往前偏移
# 偏移位置:
# -- 0 - 從文件開始位置開始偏移 | 1 - 從當(dāng)前游標(biāo)位置開始偏移 | 2 - 從文件末尾開始偏移
# b'你好1234567890'
# 游標(biāo)讀
with open('source.txt', 'rb') as f:
d1 = f.read(11)
print(d1)
# print(d1.decode('utf-8'))
# 當(dāng)前游標(biāo)的位置
print(f.tell())
# 游標(biāo)操作 - 從末尾位置開始
f.seek(-3, 2)
d2 = f.read()
print(d2.decode('utf-8')) # 890
# # 游標(biāo)操作 - 從當(dāng)前位置開始
# f.seek(-3, 1)
# d2 = f.read()
# print(d2.decode('utf-8')) # 34567890
# # 游標(biāo)操作 - 從頭開始
# f.seek(3, 0)
# d2 = f.read()
# # print(d2)
# print(d2.decode('utf-8')) # 好1234567890
# 游標(biāo)寫:會(huì)覆蓋書寫
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個(gè)字節(jié)拼接成秒傳的信息依據(jù)
# 形成秒傳規(guī)則
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
# 秒傳依據(jù)
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('慢慢傳去吧')
```
?
轉(zhuǎn)載于:https://www.cnblogs.com/huangxuanya/p/10637057.html
總結(jié)
- 上一篇: 在产后修复中心做一次骨盆修复多长时间
- 下一篇: Django进阶-auth集成认证模块