1. 程式人生 > >字符編碼與文件操作2

字符編碼與文件操作2

文件已存在 pri 所有 一行 清空文件 傳輸 文本操作 gbk pass

一、復習

1、編碼

ASCII--->Python--->Unicode

python2:默認ASCII,python:默認utf-8

編碼表:人識別的標識符與計算機識別的標識符形成的對應關系

各編碼表中字符(人能識別)所占字節(將字符轉為二進制的中間產物)數

一個字節=8個二進制位(1個十六進制位=4個二進制位)

ASCII:1~2個字節

Unicode:2個字節

GBK:1~2個字節

UTF-8:Unicode編碼的一種體現方式,1~6個字節

Unicode定長獲取信息快速, UTF-8變長傳輸速度快

2、三種字符串

r’原義 字符串

u’最普通的字符

二進制字符串:用來傳輸的字符串

1.是字符串(文本字符)的二進制體現,(如視頻資源可以轉化為二進制字符串,不翻轉為視頻資源,則就是普通字符串)

2.二進制字符串按字節為最小單位存儲單位存放數據

3.所有數據轉化為二進制字符串都應該用utf-8進行編碼嗎?

----只是文本數據

----視頻、音頻、圖像等此類數據也有編碼解碼過程,采用的編碼表不是utf-8,不用關心編 碼表

 字符與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()

二、rw模式結合

w:沒有文件就新建文件,有則清空
w = open(‘1.txt‘, ‘w‘, encoding=‘utf-8‘)
w.write(‘000\n‘)

w.flush() 寫一行刷一行
如果文件存在會將寫入文件的內容及時刷從內存刷到硬盤
  應用:在寫入大量數據,要及時處理內存空間,不然內存可能溢出導致數據丟失
  w.write(‘111\n‘)
  w.flush()   最後一次flush()操作可以省略

一次性寫入多行
w.writelines([‘222\n‘, ‘333\n‘])
w.write(‘444‘)
w.newlines
w.write(‘555‘)

w.close()
1.將內存的的數據刷新到硬盤中;2.釋放文件資源
需求:
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()

三、文件操作模式

r: 讀
w: 寫(無創建,有清空)
a: 追加(有創建的功能)

t: 文本操作(默認模式) r=>rt w=>wt a=>at
b: 非文本文件必須采用二進制模式來處理
+: 可讀可寫
r+: 不會創建文件的可讀可寫 | w+:創建清空文件的可讀可寫 | a+:創建不清空文件(追加)的可讀可寫

x:寫模式創建文件,如果文件已存在就拋出異常

with open(‘1.txt‘, ‘wt‘, encoding=‘utf-8‘) as f:
f.write(‘666‘)

借助讀寫,完成追加
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‘)

四、非文本文件復制

with open(‘333.mp4‘, ‘rb‘) as f1:
with open(‘666.mp4‘, ‘wb+‘) as f2:
for line in f1:
f2.write(line)

x:寫模式,創建文件,如果文件以存在,就拋異常
with open(‘000.txt‘, ‘x‘, encoding=‘utf-8‘) as f:
pass

五、文件遊標操作

方法: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‘)

字符編碼與文件操作2