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('慢慢傳去吧')
```
?
轉載于:https://www.cnblogs.com/huangxuanya/p/10637057.html
總結
- 上一篇: 在产后修复中心做一次骨盆修复多长时间
- 下一篇: 华为换屏多少钱啊?