Python、IO編程

一、文件讀寫
讀文件
open()函數用來打開一個文件對象 語法:open(‘路徑’,‘打開方式’)
文本文件打開方式爲‘r’,
二進制文件、字符編碼文件(GBK編碼等)打開方式爲‘rb’

f=open('/file/f.txt','r')

如果未成功打開會拋出一個IOError錯誤,反之,可用read()函數一次性讀取文件內容,會返回一個字符串str

>>>f.read()
'Hello,World!'

文件使用完畢後必須關閉,用close()函數關閉文件,語法同read()

爲防止忘記關閉文件,用with語句自動調用close()函數
語法:with open(‘路徑’ ,’打開方式’) as: +方法

with open('F:/file/f.txt','r') as f:
    print f.read()

用with讀取字符編碼文件,如GBK編碼文件:

import codecs
with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
    f.read() 

read()爲一次讀取全部內容
read(size)可反覆調用,最多讀取size個字節,size爲數字
readline()每次讀取一行內容
readlines()一次讀取所有內容,並按行返回list。(返回內容爲[ ‘…….’ ]x形式)

寫文件
寫文件用write()函數 語法:write(‘路徑’,‘文件格式’)
文本文件爲‘w’
二進制文件爲‘wb’
同樣一般用with語句

with open('F:/file/f.txt','w') as f:
    f.write('Hello,world')

要輸入特定編碼的文件同語法read一樣

二、操作文件和目錄
操作文件和目錄的函數一部分放在os模塊中,一部分放在os.path模塊中
需要對文件和目錄進行操作時,先導入os模塊

import os

創建目錄用os.mkdir()函數 語法 os.mkdir(‘已知路徑/目錄名’)
刪除目錄用os.rmdir()函數 語法 os.rmdir(‘路徑’)

用os.path.join()函數將兩個路徑合成一個,(注意:目錄或文件不需真實存在,其只對字符串進行操作。)語法 os.path.join(‘路徑’,’目錄或文件’)

>>>print os.path.join('F:/file/test8dir','test9dir')
F:/file/test8dir\test9dir  #windows分隔符爲'\',其他爲'/'

用os.path.split()函數來拆分路徑,同樣目錄或文件不需真實存在。語法:os.path.split(‘路徑’)

print os.path.split('F:/file/test8dir/X.txt)
('F:/file/test8dir', 'X.txt')  #最後一個分隔符爲分離點

用os.path.splitext()函數可以得到文件擴展名。語法:os.path.splitext(‘路徑’)

print os.path.splitext('F:/file/test8dir/test8dir/X.txt')
('F:/file/test8dir/test8dir/X', '.txt')  #文件擴展名 '.'爲分隔點

文件重命名:os.rename(‘初始文件名’,’更改明’)
刪除文件:os.remove(‘文件名’)

列出當前目錄下所有目錄

print [x for x in os.listdir('.') if os.path.isdir(x)]

要列出所有的 .py 文件

print [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

三、序列化
序列化 – pickling:變量從內存中編程可存儲或傳輸的過程。
反序列化 – unpickling:把變量內容從序列化的對象重新讀到內存裏。
實現序列化模塊:cPickle和pickle 。 前者C語言寫的速度快,導入時先嚐試導入

try:
    import cPickle as pickle
except ImportError:
    import pickle

把對象序列化寫入文件:
法①:pickle.dumps() :把任一對象序列化成一個str,之後按照文件的讀寫操作把對象寫入文件;
法②:pickle.dump() :直接把對象序列化後寫入文件
把對象從磁盤讀到內存:
法①:先把內容讀到一個str,之後pickle.loads() :反序列化對象
法②:直接用pickle.load()直接反序列化對象,同時用一個變量保存。
法一:

try:
    import cPickle as pickle
except ImportError:
    import pickle
d=dict(name='Bob',age=20,score=77)
t=pickle.dumps(d)
with open('F:/file/test1dir/dump.txt','wb') as f:
    f.write(t)
with open('F:/file/test1dir/dump.txt','rb') as f:
    h=pickle.load(f)
print h

法二:

try:
    import cPickle as pickle
except ImportError:
    import pickle
d=dict(name='Bob',age=20,score=77)
with open('F:/file/test1dir/dump.txt','wb') as f:
    pickle.dump(d,f)      #不同點

with open('F:/file/test1dir/dump.txt','rb') as f:
    h=pickle.load(f)
print h

JSON
在不同的編程語言之間傳遞對象,必須把對象序列化爲標準格式,比如XML,但更好的是JSON,其表示出來的就是一個字符串,可被所有語言讀取。
把python對象變成一個JSON:

import json
d=dict(name='Bob',age=20)
print json.dumps(d)

返回一個字典

{"age": 20, "name": "Bob"}

把JSON反序列化爲python對象,用loads():把JSON的字符串反序列化。 load()方法後者從file-like Object中讀取字符串並反序列化:
注意:反序列化得到的所有字符串對象都是unicode而不是str

json_str='{"height":175,"name":"Tom"}'
print json.loads(json_str)

輸出:

{u'name': u'Tom', u'height': 175}

JSON進階
Python的dict(字典)對象可直接序列化爲JSon的{},不過也可用來序列化class(類)對象

class Student(object):
    def __init__(self,name,age,score):   #構造函數
        self.name=name
        self.age=age
        self.score=score
def Student1dict(std):                #將類對象轉換成dict(字典)的函數
    return {
        'name':std.name,
        'age':std.age,
        'score':std.score}
s=Student('Bob',20,99)
print (json.dumps(s,default=Student1dict))   #dumps()方法第一個爲obj(對象名),默認情況下需要傳入一個將轉換成dict的方法,不然將報錯

上例,Student實例先被轉換成dict,再序列化爲JSON

但,一般class實例都有一個dict屬性,可直接將實例轉換成dict

print(json.dumps(s,default=lambda obj:obj.__dict__))

同樣,將JSON反序列化爲Student對象實例使用json.loads()方法,需先轉換出一個dict對象,然後將方法傳入object_hook函數

def dict2Student(d):
    return Student(d["name"],d["age"],d["score"])
json_str='{"name":"Bob","age":20,"score":99}'
print (json.loads(json_str,object_hook=dict2Student))

輸出:

<__main__.Student object at 0x0000000002B27240>  #是反序列化的Student實例對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章