標籤:
檔案讀寫
在Python中,檔案讀寫是通過open()函數開啟的檔案對象完成的。使用with語句操作檔案IO是個好習慣。
try: f = open(‘1.txt‘, ‘r‘) #rb寫二進位 #f = open(‘1.txt‘, ‘w‘) #wb讀二進位 f.read().decode(‘utf8‘) #f.write(‘test‘).encode(‘utf8‘)finally: if f: f.close()用with寫:with open(‘1.txt‘, ‘r‘) as f: print f.read()
如果檔案很小,read()一次性讀取最方便;如果不能確定檔案大小,反覆調用read(size)比較保險;如果是設定檔,調用readlines()最方便
目錄操作
把兩個路徑合成一個時,不要直接拼字串,而要通過os.path.join()函數,這樣可以正確處理不同作業系統的路徑分隔字元
同樣的道理,要拆分路徑時,也不要直接去拆字串,而要通過os.path.split()函數,這樣可以把一個路徑拆分為兩部分,後一部分總是最後層級的目錄或檔案名稱
得到當前工作目錄,即當前Python指令碼工作的目錄路徑: os.getcwd()返回指定目錄下的所有檔案和目錄名:os.listdir()檢驗給出的路徑是否是一個檔案:os.path.isfile()檢驗給出的路徑是否是一個目錄:os.path.isdir()判斷是否是絕對路徑:os.path.isabs()檢驗給出的路徑是否真地存:os.path.exists()返回一個路徑的目錄名和檔案名稱:os.path.split() 分離副檔名:os.path.splitext()擷取路徑名:os.path.dirname()擷取檔案名稱:os.path.basename()擷取檔案屬性:os.stat(file)給出當前平台使用的行終止符:os.linesep Windows使用‘\r\n‘,Linux使用‘\n‘而Mac使用‘\r‘建立空檔案os.mknod("test.txt") 建立目錄os.mkdir("file") 複製檔案shutil.copyfile("oldfile","newfile") #oldfile和newfile都只能是檔案shutil.copy("oldfile","newfile") #oldfile只能是檔案夾,newfile可以是檔案,也可以是目標目錄複製檔案夾shutil.copytree("olddir","newdir") #olddir和newdir都只能是目錄,且newdir必須不存在移動檔案/目錄shutil.move("oldpos","newpos") 重新命名檔案/目錄os.rename("oldname","newname") 刪除檔案os.remove("file")刪除目錄os.rmdir("dir") #只能刪除空目錄shutil.rmtree("dir") #空目錄、有內容的目錄都可以刪轉換目錄os.chdir("C:\\123") #將目前的目錄設為 "C:\123", 相當於DOC命令的 CD C:\123
file-like Object
像open()函數返回的這種有個read()方法的對象,在Python中統稱為file-like Object。除了file外,還可以是記憶體的位元組流,網路流,自訂流等等。file-like Object不要求從特定類繼承,只要寫個read()方法就行。
StringIO就是在記憶體中建立的file-like Object,常用作臨時緩衝。
序列化
把變數從記憶體中變成可儲存或傳輸的過程稱之為序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是一個意思。
反過來,把變數內容從序列化的對象重新讀到記憶體裡稱之為還原序列化,即unpickling。
如果我們要在不同的程式設計語言之間傳遞對象,就必須把對象序列化為標準格式,例如JSON
JSON和Python內建的資料類型對應如下:
JSON類型 |
Python類型 |
{} |
dict |
[] |
list |
"string" |
‘str‘或u‘unicode‘ |
1234.56 |
int或float |
true/false |
True/False |
null |
None |
對於單一資料型別(string、unicode、int、float、list、tuple、dict),可以直接處理。
序列化
dumps()方法返回一個str,內容就是標準的JSON。
dump()方法可以直接把JSON寫入一個file-like Object。
還原序列化
loads()把JSON的字串還原序列化
load()從file-like Object中讀取字串並還原序列化
>>> import json>>> d = dict(name=‘David‘, age=20, score=100)>>> d_encode = json.dumps(d)>>> d_encode‘{"age": 20, "score": 100, "name": "David"}‘>>> with open(‘D:\\1.txt‘, ‘wb‘) as f: d_encode_file = json.dump(d, f)>>> d_decode = json.loads(d_encode)>>> d_decode{u‘age‘: 20, u‘score‘: 100, u‘name‘: u‘David‘}>>> with open(‘D:\\1.txt‘, ‘rb‘) as f: d_decode_file = json.load(f) >>> d_decode_file{u‘age‘: 20, u‘score‘: 100, u‘name‘: u‘David‘}
將class的執行個體對象encode,decode為json
import jsonclass Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = scoredef student2dict(std): return { ‘name‘: std.name, ‘age‘: std.age, ‘score‘: std.score }def dict2student(d): return Student(d[‘name‘], d[‘age‘], d[‘score‘])s = Student(‘David‘, 20, 100)print(json.dumps(s, default=student2dict))#選擇性參數default就是把任意一個對象變成一個可序列為JSON的對象json_str = ‘{"age": 20, "score": 88, "name": "Bob"}‘print(json.loads(json_str, object_hook=dict2student))#loads()方法首先轉換出一個dict對象,傳入的object_hook函數負責把dict轉換為Student執行個體
2015-05-10
python之IO操作