Python3入门(十一)——IO编程
一、文件讀寫
python的文件操作和C是兼容的
1.讀文本文件
讀文件操作如下:
f = open("F:/1.txt", "r") data = f.read() print(data)其中"r"表示read,讀文件,再使用read()方法就把文件內容讀取出來了
和Java一樣,操作文件需要close掉,并且強烈建議在finally中close,代碼如下:
try:f = open("F:/1.txt", "r")data = f.read()print(data) finally:if f:f.close()但是!Python這里又支持了with操作,這比Java必須要寫上面類似的代碼確實要簡潔不少:
with open("F:/1.txt", "r") as f:print(f.read())這樣,try finally以及close等全部可以省略了!
這里read()也可以加參數size來限制讀取的字節數,防止一次性讀取太多而爆掉:
print(f.read(4))或者按行讀取也是闊以的:
readline() # 讀取一行 readlines() # 讀取所有行,返回listfor line in f.readlines():print(line.strip()) # 把末尾的'\n'刪掉
這種帶有read()方法的對象稱為 file-like Object,常見的有StringIO
2.讀二進制文件
使用rb模式打開即可:
f = open("F:/1.jgp", "rb") f.read()3.字符編碼
默認是UTF-8,指定編碼可以添加encoding參數
f = open("F:/1.txt", "r", encoding="GBK") f.read()??忽略一些亂七八糟的錯誤,可以使用errors:
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')4.寫文件
和讀類似,w、wb進行文本文件、二進制文件的寫,文件編碼同讀文件的操作
with open("F:/1_new.txt", "w") as f:f.write("Hello Python3!")w是覆蓋寫的形式,追加使用a參數,完整參照文檔
二、StringIO與BytesIO
1.StringIO
在內存中讀寫string,稱之為StringIO。它可以在內存中進行讀寫:
from io import StringIOf = StringIO() f.write("Hello ") f.write("Python3!") print(f.getvalue())可以像文件一樣進行操作:
from io import StringIOf = StringIO("Hello\nPython3!") while True:line = f.readline()if line == "":breakprint(line.strip())? 2.bytesIO
f2 = BytesIO() f2.write("我愛中國".encode("UTF-8"))注意這里寫入的不是字符串string,而是經過編碼后的bytes
三、操作文件和目錄
使用例如dir cp等操作文件的命令,可以通過Python的os模塊來實現,底層是通過調用系統的接口進行具體實現的:
>>> import os >>> os.name # 操作系統類型 'posix'——代表linux,nt代表windows,linux中還可以通過os.uname()來獲取更加詳細的信息1.獲取環境變量:
>>> os.environ #查看所有環境變量 >>> os.environ.get('PATH') #獲取特定變量2.操作文件和目錄
os.path中的部分操作:
# 查看當前目錄的絕對路徑: >>> os.path.abspath('.') '/Users/michael' # 在某個目錄下創建一個新目錄,首先把新目錄的完整路徑表示出來: >>> os.path.join('/Users/michael', 'testdir') '/Users/michael/testdir' # 然后創建一個目錄: >>> os.mkdir('/Users/michael/testdir') # 刪掉一個目錄: >>> os.rmdir('/Users/michael/testdir')請注意路徑的操作不要直接強行通過字符串拆分合并進行,而是使用os模塊的方法!
更多操作,參見相關文檔
四、序列化
python通過?pickle?模塊進行序列化操作!
pickle.dumps()方法把任意對象序列化成一個bytes,然后,就可以把這個bytes寫入文件。或者用另一個方法pickle.dump()直接把對象序列化后寫入一個file-like Object:
>>> import pickle >>> d = dict(name='Bob', age=20, score=88) >>> pickle.dumps(d)>>> f = open('dump.txt', 'wb') >>> pickle.dump(d, f) >>> f.close()反序列化方法通過load方法實現:
>>> f = open('dump.txt', 'rb') >>> d = pickle.load(f) >>> f.close()與JSON轉換:
類似Java的fastjson等對象與json的轉換,python提供了json模塊用來提供json字符串與dict的轉換。好處與便利性不再贅述:
>>> import json >>> d = dict(name='Bob', age=20, score=88) >>> json.dumps(d) #返回一個json的str字符串 '{"age": 20, "score": 88, "name": "Bob"}'類似的,也提供了鏡像方法loads,返回與JSON對應的dict
>>> json.loads(json_str)JSON與對象的轉換:
上面介紹了默認的JSON字符串與dict的轉換,當然肯定要有class對象與JSON的轉換了:
主要通過dumps()參數列表,實現一個class到dict的轉換函數即可:
def student2dict(std):return {'name': std.name,'age': std.age,'score': std.score}>>> print(json.dumps(s, default=student2dict)) {"age": 20, "name": "Bob", "score": 88}?
轉載于:https://www.cnblogs.com/jiangbei/p/8946343.html
總結
以上是生活随笔為你收集整理的Python3入门(十一)——IO编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从智能合约到智能资产
- 下一篇: spring 整和activemq