但stdio畢竟只是檔案流,無法作跨檔案的io。所以必須配合資料流(DF),就可以形成一種跨檔案處理。
提醒:牽扯到跨檔案處理,編輯器建議用vsCode喔~
有兩個檔案:
a.py
b.py
開始實作跨檔案stdio吧~~
#a.py
import sys
import os
import time
ton = time.time()
fb = open('b.py', 'w') # 預設為寫入
fb.write("import sys , os \n")
fb.write("sys.stdout.write('hi')")
fb.close() # 關閉 fb(b.py) 的編輯
toff = time.time()
time.sleep(toff-ton) #計算執行時間
os.system("python b.py")
這裡的open函數可以建立檔案,更深入以後os套件會談到。
這程式碼可透過一些os套件的方法,讓a.py去執行b.py。 你會發現,如果透過土法鍊剛的stdio,都會很講求執行時間。因為調用b.py也須等到b.py執行完畢才可單獨調用(stdio不能同時執行,而是按步驟串列執行)。
sys.stdout.flush()
fname.flush()
stdout本身是有緩衝區的,印出的資料可看成一次性輸出。就好像匯流排一樣,無法負荷的資料先存入快取,等輸出時在一次拿取。
import os , sys , time
a = int(input("輸入次數:"))
for i in range(0,a):
i += i
print(i)
sys.stdout.flush() #緩衝區資料
time.sleep(0.5)
ps:linux cat執行指令本身也有緩衝區,所以linux用戶要使用此方法才能正常執行
資料一多也可當作刷新資料使用,防止資料過多造成文件死當。
import sys , os , time
fr = open('range.txt', 'w+')
for i in range(99999999):
i += 1
fr.write('%s\n' %i)
fr.flush() #刷新緩衝區
fr.write('done')
fr.close()
這觀念在網頁中可是很重要的一個動作,意思是只要要求的輸出或動作複符合規定,就可以讓所有的行為輸出都導向其中一個方法。
而在stdio裡,這個觀念被用在一個行為導向多個方法:
import sys
f_re = open('c.txt', 'w')
sys.stdout.write() = f_re
print("i'm f_re on txt")
之前有談到 print() 與 sys.stdout 等價是有原因的,因為它可以將一個印出的行為導向變成stdout(檔案處理/輸出)。