復習
一。類型轉換
1.數字類型:int() | bool() | float()
2.str與int:int('10') | int('-10') | int('0') | float('-.5') | float('3.14') | str(數字)
3.重點 - str與list:
'abc' => ['a', 'b', 'c']: list('abc') | ''.join(['a', 'b', 'c'])
'abc|def|xyz' => ['abc', 'def', 'xyz']: s.split('|') | '|'.join(ls)
4.list、set、tuple:類型()
5.list與dict:
a=1&b=2&c=3 <=> [('a', 1), ('b', 2), ('c', 3)] <=> {'a': 1, 'b': 2, 'c': 3}
dic = {}
for k, v in [('a', 1), ('b', 2), ('c', 3)]:
dic[k] = v
ls = []
for k, v in {'a': 1, 'b': 2, 'c': 3}.items():
ls.appen((k, v))
6.可以通過字典構建任意數據的映射關系
type_map = {
1: '壹',
'壹': 1,
'owen':(1, 88888),
'add': add # add是功能(函數)
}
1.數字類型:int() | bool() | float()
2.str與int:int('10') | int('-10') | int('0') | float('-.5') | float('3.14') | str(數字)
3.重點 - str與list:
'abc' => ['a', 'b', 'c']: list('abc') | ''.join(['a', 'b', 'c'])
'abc|def|xyz' => ['abc', 'def', 'xyz']: s.split('|') | '|'.join(ls)
4.list、set、tuple:類型()
5.list與dict:
a=1&b=2&c=3 <=> [('a', 1), ('b', 2), ('c', 3)] <=> {'a': 1, 'b': 2, 'c': 3}
dic = {}
for k, v in [('a', 1), ('b', 2), ('c', 3)]:
dic[k] = v
ls = []
for k, v in {'a': 1, 'b': 2, 'c': 3}.items():
ls.appen((k, v))
6.可以通過字典構建任意數據的映射關系
type_map = {
1: '壹',
'壹': 1,
'owen':(1, 88888),
'add': add # add是功能(函數)
}
二。字符編碼:
編碼表:人能識別的符號與機器能識別的符號(01組成的二進制碼)映射關系
py2:ASCII,常用ASCII表只有英文、數字、英文符號與與機器能識別的符號的對應關系
py3:utf-8,是unicode編碼表的一種實現方式,采用變長存儲數據,字母數字簡單符號1個字節,中文3~6字節
utf-8: 變長,在英文數字較多時,更節省空間,用於傳輸,cpu與硬盤中采用的編碼格式
utf-16: 定長,英文數字漢字都是采用2個字節,讀存效率高,內存中采用的編碼格式
gbk => utf-8: 轉碼
普通字符串 => 二進制字符串:編碼,目的是用於傳輸數據 'abc'.encode('utf-8')
二進制字符串 => 普通字符串:解碼,目的是用於顯示數據 b'abc'.decode('utf-8')
編碼表:人能識別的符號與機器能識別的符號(01組成的二進制碼)映射關系
py2:ASCII,常用ASCII表只有英文、數字、英文符號與與機器能識別的符號的對應關系
py3:utf-8,是unicode編碼表的一種實現方式,采用變長存儲數據,字母數字簡單符號1個字節,中文3~6字節
utf-8: 變長,在英文數字較多時,更節省空間,用於傳輸,cpu與硬盤中采用的編碼格式
utf-16: 定長,英文數字漢字都是采用2個字節,讀存效率高,內存中采用的編碼格式
gbk => utf-8: 轉碼
普通字符串 => 二進制字符串:編碼,目的是用於傳輸數據 'abc'.encode('utf-8')
二進制字符串 => 普通字符串:解碼,目的是用於顯示數據 b'abc'.decode('utf-8')
今日內容
一。三種字符串
1.普通字符串:u'以字符作為輸出單位'
print(u'abc') # 用於顯示
2.二進制字符串:b'' 二進制字符串以字節作為輸出單位
print(b'abc') # 用於傳輸
print(b'abc') # 用於傳輸
3. 原義字符串:r'以字符作為輸出單位,所有在普通字符串中能被轉義的符號在這都原樣輸出'
print(u'a\tb\nc')
print(r'a\tb\nc') # 取消轉義
print(u'a\tb\nc')
print(r'a\tb\nc') # 取消轉義
print(r'F:\python8期\課堂內容\day08\代碼\1.三種字符串.py')
二。文件操作的三步驟
1.打開文件: 硬盤空間被操作系統持有,文件對象被應用程序持有
f = open('source.txt', 'r', encoding='utf-8')
f = open('source.txt', 'r', encoding='utf-8')
2.操作文件
data = f.read()
data = f.read()
3.釋放文件:釋放操作系統對硬盤空間的持有
f.close()
f.close()
(一)基礎的讀
f = open('source.txt', 'r', encoding='utf-8')
f.read() # 將所有內容一次性讀完
f.read(10) # 讀取指定字符數
f.readline() # 一次讀取一行(文件的換行標識就是結束本次讀取的依據)
f.readlines() # 將所有內容讀存,按換行標識作為讀取一次的依據,存放為列表
f.close()
```
f.read() # 將所有內容一次性讀完
f.read(10) # 讀取指定字符數
f.readline() # 一次讀取一行(文件的換行標識就是結束本次讀取的依據)
f.readlines() # 將所有內容讀存,按換行標識作為讀取一次的依據,存放為列表
f.close()
```
(二)基礎的寫
wf = open('target.txt', 'w', encoding='utf-8')
wf.write('123\n') # 一次寫一條,行必須用\n標識
wf.write('456\n')
wf.flush() # 向操作系統發送一條將內存中寫入的數據刷新到硬盤
wf.write('789\n')
wf.writelines(['abc\n', 'def\n', 'xyz\n']) # 一次寫多行,行必須用\n標識
wf.write('456\n')
wf.flush() # 向操作系統發送一條將內存中寫入的數據刷新到硬盤
wf.write('789\n')
wf.writelines(['abc\n', 'def\n', 'xyz\n']) # 一次寫多行,行必須用\n標識
wf.close() # 1.將內存中寫入的數據刷新到硬盤 2.釋放硬盤空間
```
```
(三)with...open語法
# 優化整合了文件資源的打開與釋放
# -- 在with的縮進內可以操作文件對象,一旦取消縮進,資源就被釋放了
# part1
# as起別名,rf持有文件資源的變量
with open('target.txt', 'r', encoding='utf-8') as rf:
# 文件操作的具體代碼
# 縮進一旦取消縮進,資源就被釋放了
# as起別名,rf持有文件資源的變量
with open('target.txt', 'r', encoding='utf-8') as rf:
# 文件操作的具體代碼
# 縮進一旦取消縮進,資源就被釋放了
# part2
with open('target.txt', 'r', encoding='utf-8') as rf1, open('target1.txt', 'r', encoding='utf-8') as rf2:
print(rf1.read())
print(rf2.read())
# print(rf1.read()) # 報錯
# print(rf2.read()) # 報錯
# part3
with open('target.txt', 'r', encoding='utf-8') as rf1:
with open('target1.txt', 'r', encoding='utf-8') as rf2:
print(rf1.read())
print(rf2.read())
# print(rf1.read()) # 可以操作
# print(rf2.read()) # 不可以操作
```
(四)文件的操作模式
1.主模式:r | w | a | x
-- 主模式只能選取一個,規定着主要的操作方式
從模式:t | b | +
-- 從模式也必須出現,但個數不一定是一個,為主模式額外添加功能
-- 主模式只能選取一個,規定着主要的操作方式
從模式:t | b | +
-- 從模式也必須出現,但個數不一定是一個,為主模式額外添加功能
r: 讀,必須有
w: 清空寫,可有可無
a: 追加寫,可有可無
x:創建寫,必須無
w: 清空寫,可有可無
a: 追加寫,可有可無
x:創建寫,必須無
t:默認,按字符操作
b:按字節操作
+:可讀可寫
b:按字節操作
+:可讀可寫
# rt: 文件必須提前存在,不存在報錯,文件操作采用字符形式 - 簡寫為 r
# wt: 文件可以存在,也可以不存在,存在則清空后寫入,不存在新建后寫入,文件操作采用字符形式 - 簡寫為 w
# at: 文件可以存在,也可以不存在,存在在之前內容的末尾追加寫入,不存在新建后寫入,文件操作采用字符形式 - 簡寫為 a
# wt: 文件可以存在,也可以不存在,存在則清空后寫入,不存在新建后寫入,文件操作采用字符形式 - 簡寫為 w
# at: 文件可以存在,也可以不存在,存在在之前內容的末尾追加寫入,不存在新建后寫入,文件操作采用字符形式 - 簡寫為 a
# rb: 文件必須提前存在,不存在報錯,文件操作采用字節形式
# wb: 文件可以存在,也可以不存在,存在則清空后寫入,不存在新建后寫入,文件操作采用字節形式
# ab: 文件可以存在,也可以不存在,存在在之前內容的末尾追加寫入,不存在新建后寫入,文件操作采用字節形式
# wb: 文件可以存在,也可以不存在,存在則清空后寫入,不存在新建后寫入,文件操作采用字節形式
# ab: 文件可以存在,也可以不存在,存在在之前內容的末尾追加寫入,不存在新建后寫入,文件操作采用字節形式
# r+t:文件必須存在的可讀可寫,默認從頭開始替換寫,按字符操作
# w+t:文件存在清空不存在創建的可讀可寫,按字符操作
# a+t:文件存在追加不存在創建的可讀可寫,按字符操作
# w+t:文件存在清空不存在創建的可讀可寫,按字符操作
# a+t:文件存在追加不存在創建的可讀可寫,按字符操作
# r+b:文件必須存在的可讀可寫,默認從頭開始替換寫,按字節操作
# w+b:文件存在清空不存在創建的可讀可寫,按字節操作
# a+b:文件存在追加不存在創建的可讀可寫,按字節操作
'''
```
# w+b:文件存在清空不存在創建的可讀可寫,按字節操作
# a+b:文件存在追加不存在創建的可讀可寫,按字節操作
'''
```
2.文件的操作編碼問題
t模式下:原文件采用什么編碼,你就選取什么編碼操作,如果不選取,默認跟操作系統保持一致
-- t模式下一定要指定編碼
b模式下:硬盤的數據就是二進制,且能根據內容識別出編碼,寫入時的數據也是通過某種編碼提前處理好的,所有在操作時,沒有必要再去規定編碼
'''
'''
3. 文件的復制
# 文本文件的復制:可以t也可以b
with open('target.txt', 'r', encoding='utf-8') as rf:
with open('target2.txt', 'w', encoding='utf-8') as wf:
for line in rf:
wf.write(line)
with open('target.txt', 'rb') as rf:
with open('target3.txt', 'wb') as wf:
for line in rf:
wf.write(line)
with open('target3.txt', 'wb') as wf:
for line in rf:
wf.write(line)
# 非文本文件只能采用b模式操作,不需要指定編碼 - 因為根本不涉及編碼解碼過程
with open('001.mp4', 'rb') as rf:
with open('002.mp4', 'wb') as wf:
for line in rf:
wf.write(line)
```
4. 游標操作
(1).游標操作的是字節,所有只能在b模式下進行操作
(2).游標操作可以改變操作位置,r模式下可以改變位置進行操作,所有主模式選擇r模式
(3.)seek(offset, whence):
(3.)seek(offset, whence):
-- offset為整數就是往后偏移多少個字節,負數就是往前偏移多少個字節
-- whence:0代表將游標置為開頭,1代表從當前位置,2代表將游標置為末尾
-- whence:0代表將游標置為開頭,1代表從當前位置,2代表將游標置為末尾
案例:
# 你是日本人
with open('target.txt', 'rb') as f:
# 先讀6個字節
data = f.read(6)
print(data.decode('utf-8')) # 你是
# 將游標從頭開始往后偏移3個字節
f.seek(3, 0)
data = f.read(6)
print(data.decode('utf-8')) # 是日
# 從當前游標位置往前偏移3個字節
f.seek(-3, 1)
data = f.read(3)
print(data.decode('utf-8')) # 日
# 你是日本人
with open('target.txt', 'rb') as f:
# 先讀6個字節
data = f.read(6)
print(data.decode('utf-8')) # 你是
# 將游標從頭開始往后偏移3個字節
f.seek(3, 0)
data = f.read(6)
print(data.decode('utf-8')) # 是日
# 從當前游標位置往前偏移3個字節
f.seek(-3, 1)
data = f.read(3)
print(data.decode('utf-8')) # 日
f.seek(-3, 2)
data = f.read(3)
print(data.decode('utf-8')) # 人
data = f.read(3)
print(data.decode('utf-8')) # 人