【Python】编程笔记8
文章目錄
- IO編程
- 一、文件讀寫
- 1、讀文件
- (1)open()
- (2)read()
- (3)close()
- (4)try...finally實現
- (5)with 語句(強烈推薦)
- (6)注意
- (7)二進制文件
- (8)字符編碼——encoding、errors
- 2、寫文件
- (1)基本
- (2)with 語句
- 二、StringIO 和 BytesIO
- 1、StringIO
- 2、BytesIO
- 三、操作文件和目錄
- 1、系統屬性信息
- 2、操作文件和目錄
- 四、序列化
- 1、pickle模塊
- 2、JSON模塊
- (1)class 的序列化
IO編程
通常,程序完成 IO 操作會有 Input 和 Output 兩個數據流。Input Stream 就是數據從外面(磁盤、網絡)流進內存, Output Stream 就是數據從內存流到外面去。
分類:同步IO、異步IO。區別就在于是否等待 IO 執行的結果。
異步 IO 來編寫程序性能會遠遠高于同步 IO,但是異步 IO
的缺點是編程模型復雜。
一、文件讀寫
讀寫文件:請求操作系統打開一個文件對象(通常稱為文件描述符),然后,通過操作系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)。
1、讀文件
步驟:open()、read()、close()
(1)open()
open() 函數傳入文件名和標示符。其中,r 表示只讀。
f = open('E:\codes\python\basic\1.py', 'r')==》若文件不存在,則拋出 IOError 錯誤。
(2)read()
調用 read() 方法可一次讀取文件的全部內容到內存中,用一個 str 對象表示。
f.read()(3)close()
關閉文件——close() 方法
==》文件使用完畢后必須關閉,因為文件對象會占用操作系統的資源,并且操作系統同一時間能打開的文件數量也是有限的。
(4)try…finally實現
避免產生IOError的錯誤,而導致后面close()無法調用。
try:f = open('E:\\codes\\python\\basic\\1.txt', 'r')print(f.read()) finally:if f:f.close()(5)with 語句(強烈推薦)
簡潔、不用 f.close() 方法
with open('E:\\codes\\python\\basic\\1.txt', 'r') as f:print(f.read())(6)注意
- 若文件大,直接調用 read() 會導致內存爆掉==》read(size)方法,每次最多讀取 size 個字節的內容;
- readline() 函數:每次讀取一行內容;
- readlines() 函數:一次讀取所有內容并按行返回 list;
(7)二進制文件
二進制文件:圖片、視頻等等==》‘rb’模式打開文件
f = open('/Users/michael/test.jpg', 'rb') f.read() # b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六進制表示的字節(8)字符編碼——encoding、errors
讀取 GBK 編碼的文件。==》encoding = ‘gbk’
當遇到 UnicodeDecodeError (文件中夾雜一些非法編碼的字符)==》errors = ‘ignore’,也就是忽略編碼錯誤。
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')2、寫文件
(1)基本
open() 函數,標示符為 ‘w’ 或 ‘wb’,表示寫文本文件或寫二進制文件。
f = open('/Users/michael/test.txt', 'w') f.write('Hello, world!') f.close()注意:寫文件時,操作系統往往不會立刻把數據寫入磁盤,而是放到內存緩存起來,空閑的時候再慢慢寫入。只有調用 close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤。
(2)with 語句
可以使用 encoding 參數設置指定的編碼。
with open('/Users/michael/test.txt', 'w') as f:f.write('Hello, world!')二、StringIO 和 BytesIO
1、StringIO
表示在內存中讀寫 str。
from io import StringIO #### 寫入 f = StringIO() print(f.write('hello')) print(f.write(' ')) print(f.write('world!')) # getvalue(): 獲得寫入后的 str print(f.getvalue())#### 讀取 f = StringIO('Hello!\nHi!\nGoodbye!') while True:s = f.readline()if s == '':breakprint(s.strip())輸出結果
5 1 6 hello world! Hello! Hi! Goodbye!2、BytesIO
表示在內存中讀寫 二進制數據。
from io import BytesIO ### 寫入 f = BytesIO() print(f.write('中文'.encode('utf-8'))) print(f.getvalue())### 讀取 f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87') print(f.read())輸出結果
6 b'\xe4\xb8\xad\xe6\x96\x87' b'\xe4\xb8\xad\xe6\x96\x87'三、操作文件和目錄
模塊:os
注意:os 模塊的某些函數是跟操作系統相關的
1、系統屬性信息
import os print(os.name) # 操作系統類型 # uname()在 Linux 有,Windows 沒有 # print(os.uname()) # 獲取詳細的系統信息 print(os.environ) # 環境變量 print(os.environ.get('PATH')) # 獲取某個環境變量的值2、操作文件和目錄
在 os 模塊 和 os.path 模塊中 + shutil 模塊
print(os.path.abspath('.')) # 查看當前目錄的絕對路徑 # 在某個目錄下創建一個新目錄,首先把新目錄的完整路徑表示出來 print(os.path.join('E:\codes\python\\basic', 'testdir')) ## 創建一個目錄 os.mkdir('E:\codes\python\\basic\\1') ## 刪除一個目錄 os.rmdir('E:\codes\python\\basic\\1') # 對文件重命名: os.rename('test.txt', 'test.py') # 刪掉文件: os.remove('test.py') # 復制文件 from shutil import copyfile copyfile('1.py', '11.py') # 源文件 ==》 目標文件把兩個路徑合成一個時,不要直接拼字符串。==》os.path.join() 函數,可以正確處理不同操作系統的路徑分隔符。
同理,要拆分路徑時==》os.path.split()函數,后一級別總是目錄或文件名。
拆分擴展名——os.path.splitext() 函數
過濾文件
## 列出所有的.py 文件 print([x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py'])四、序列化
序列化:把變量從內存中變成可存儲或傳輸的過程。在Python中稱為 picking。
反序列化:把變量內容從序列化的對象重新讀到內存里的過程。在Python中稱為 unpicking。
1、pickle模塊
把一個對象序列化并寫入文件。
import pickle d = dict(name = 'Bob', age = 20, score = 88) pickle.dumps(d) # b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Bobq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x05\x00\x00\x00scoreq\x04KXu.'## 序列化到dump.txt文件中 f = open('dump.txt', 'wb') pickle.dump(d, f) f.close()## 反序列化 f = open('dump.txt', 'rb') d = pickle.load(f) f.close() print(d)pickle.dumps() 方法:把任意對象序列化成一個bytes,然后就可以把這個 bytes 寫入文件。
pickle.dump() 方法:直接把對象序列化后寫入一個 file-like Object.
把對象從磁盤讀取到內存時。
(1)內容=》bytes=》pickle.loads() 方法反序列化出對象
(2)直接用 pickle.load() 從一個file-like Object 中直接反序列化出對象。
注意:Python不同版本的Pickle可能不兼容,所以只能保存那些不重要的數據,不能成功反序列化也沒關系。
2、JSON模塊
序列化的標準化格式:JSON,且比XML快,可以在Web網頁中讀取。
JSON 與 Python的內置數據類型對應如下:
| {} | dict |
| [] | list |
| “string” | str |
| 1234.56 | int 或 float |
| true/false | True/False |
| null | None |
dict 《==》dict
import json d = dict(name = 'Bob', age = 20, score = 88) print(json.dumps(d))json_str = '{"age":20, "score":88, "name":"Bob"}' print(json.loads(json_str))(1)class 的序列化
import json class Student(object):def __init__(self, name, age, score):self.name = nameself.age = ageself.score = score ## 序列化——default參數 s = Student('Bob', 20, 88) # obj.__dict__:把任意 class 的實例變為 dict print(json.dumps(s, default=lambda obj: obj.__dict__))## 反序列化 def dict2student(d):return Student(d['name'], d['age'], d['score']) json_str = '{"age":20, "score":88, "name":"Bob"}' print(json.loads(json_str, object_hook=dict2student))總結
以上是生活随笔為你收集整理的【Python】编程笔记8的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】编程笔记7
- 下一篇: 【Python】编程笔记9