iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
0

但stdio畢竟只是檔案流,無法作跨檔案的io。所以必須配合資料流(DF),就可以形成一種跨檔案處理。
提醒:牽扯到跨檔案處理,編輯器建議用vsCode喔~


有兩個檔案:

a.py
b.py

開始實作跨檔案stdio吧~~

  • a.py stdin , b.py stdout

#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結論:
    如果真要用python來處理資料,其實用os套件會更方便且有效率。但畢竟os也是stdio發展而來的,所以了解stdio運作還是有它的重要性。

重新導向

這觀念在網頁中可是很重要的一個動作,意思是只要要求的輸出或動作複符合規定,就可以讓所有的行為輸出都導向其中一個方法。
而在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(檔案處理/輸出)。


上一篇
[D6] 資料處理:檔案流2
下一篇
[D8] python排序(sort)和引入方式
系列文
從寫程式到脫離菜雞的歷練(以python為主的資處與檔案權限)32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言