Day 11 IO程式設計

2022-08-09 02:09:17 字數 3882 閱讀 9174

由於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 in

f.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

'>>> print

u測試

這裡有簡化的方法,利用codecs模組,自動轉碼

import

codecs

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方法

>>> import

json

>>> 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物件。

def

student2dict(std):

return

print(json.dumps(s, default=student2dict))

將json反序列化為乙個student物件例項

def

dict2student(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...