由於cup的執行速度遠高於其他外設,io操作有兩種方式:
同步io:cup登著,程式暫停直到執行完後續**
非同步io:cup不等待,去做其他的事情,磁碟做完該做的事情後,告訴cup,cup再進行後續**
非同步io操作較為複雜,這裡記錄同步io操作。
python中讀寫檔案是通過由作業系統提供的。
讀檔案:先使用open()方法開啟檔案,之後使用read()方法讀入記憶體。
>>> f = open('/users/michael/test.txt
', '
r')
>>>f.read()'hello, world!
'
最後,必須close()關閉檔案,因為檔案物件會占用作業系統的資源。
>>> f.close()
而在其中一旦出了錯誤,就會丟擲ioerror,為了保證最後能close(),使用with語句,來代替
with open('/path/to/file
', 'r'
) as f:
print f.read()
其中,read()一次性讀取全部內容,read(size),每次讀取size個位元組的內容,readline()每次讀取一行內容,readlines()一次讀取所有內容,每一行都儲存在list的乙個元素中。
對於readlines()可以使用:
for line inf.readlines():
print(line.strip()) #
把末尾的'\n'刪掉
凡是可以使用open()開啟的物件,都是file-like object。除了file外,還有記憶體的位元組流,網路流,自定義流等。
對於非ascii編碼的檔案,必須得由二進位制模式開啟,再解碼。比如gbk編碼的檔案:
>>> f = open('/users/michael/gbk.txt
', 'rb'
)>>> u = f.read().decode('
gbk'
)>>>uu'
\u6d4b\u8bd5
u測試
這裡有簡化的方法,利用codecs模組,自動轉碼
importcodecs
with codecs.open(
'/users/michael/gbk.txt
', '
r', '
gbk'
) as f:
f.read()
#u'\u6d4b\u8bd5'
寫檔案:寫檔案與讀檔案類似,為確保資料全部由記憶體寫入檔案,使用with語句
with open('/users/michael/test.txt
', 'w'
) as f:
f.write(
'hello, world!
')
如有特定編碼的文字檔案,使用codecs模組。
獲取環境變數:os.environ
獲取某個環境變數的值:os.getenv(『path』)
檢視當前目錄的據對路徑:os.path.abspath('.')
將兩個路徑拼成乙個:os.path.join('/user/michael', 'testdir')
建立乙個目錄:os.mkdir('/users/michael/testdir')
刪除乙個目錄:os.rmdir('/users/michael/testdir')
拆分路徑,得到最後一級的檔案或目錄名:os.path.split('/users/michael/testdir/file.txt')
拆分路徑,得到副檔名:os.path.splitext('/path/to/file.txt')
檔案重新命名:os.rename('test.txt', 'test.py')
刪掉檔案:os.remove('test.py')
複製檔案:在shutil模組中的copyfile()
列出當前目錄下的所有目錄:[x for x in os.listdir('.') if os.path.isdir(x)]
列出所有的.py檔案:[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
變數從記憶體中變成可儲存或傳輸的過程稱為序列化,python中負責序列化的叫做pickle和cpickle。
pickle和cpickle的區別在於cpickle是用c寫的,速度快;pickle是用python寫的,速度慢。所以:
try:
import
cpickle as pickle
except
importerror:
import pickle
將物件序列化並寫入檔案:
>>> f = open('dump.txt
', 'wb'
)>>>pickle.dump(d, f)
>>> f.close()
將物件從磁碟讀到記憶體,反序列化:
>>> f = open('dump.txt
', 'rb'
)>>> d =pickle.load(f)
>>>f.close()
>>>d
pickle序列化物件後,儲存的變數和原來的變數完全不一樣,知識內容相同,而且每個語言序列化後的變數也是不一樣的。為了在不同的程式語言間傳遞物件,必須把物件序列化為標準格式。python內建的json模組提供了非常完善的python物件到json格式的轉換。
{}dict
list
"string"
'str'或u'unicode'
1234.56
int或float
true/false
true/false
null
none
使用json.dump方法
>>> importjson
>>> d = dict(name='
bob', age=20, score=88)
>>>json.dumps(d)
''
類似的,dump()方法可以直接把json寫入乙個file-like object
json反序列化
>>> json_str = ''>>>json.loads(json_str)
loads()把json的字串反序列化,load()從file-like object中讀取字串並序列化
將student例項變成乙個json物件。
defstudent2dict(std):
return
print(json.dumps(s, default=student2dict))
將json反序列化為乙個student物件例項
defdict2student(d):
return student(d['
name
'], d['
age'], d['
score'])
json_str = '
'print(json.loads(json_str, object_hook=dict2student))
注:本文為學習廖雪峰python入門整理後的筆記
C 基礎程式設計DAY11
求乙個整數各位數之和的函式 include include using namespace std intgetsum int n return sum int main 寫乙個函式,判斷某個數是否素數,以及求1 1000以內的素數 include include include using nam...
day11 網路程式設計
主要內容 tcp ip四層模型tcp面向連線 三次握手 第一次握手,客戶端向伺服器端發出連線請求,等待伺服器確認。第二次握手,伺服器端向客戶端回送乙個響應,通知客戶端收到了連線請求。第三次握手,客戶端再次向伺服器端傳送確認資訊,確認連線 udp面向無連線 不需要建立連線,直接傳送,每個資料報大小在6...
Linux C 系統程式設計 day11
引數列表無參 只有乙個型別轉換函式,自定義型別向其他型別轉換時就會自己呼叫 int number 1 namespace wd void print int number return pinstance private singleton singleton private static sing...