最近用 Python 寫了個 Slack Bot,因為偷懶所以我把 log 訊息直接 print 出來後用 tee 指令存到檔案裡,這樣就可以同時在 console 看到運作的資訊,又能將這些資訊保留到檔案裡,不過在用 Python print() 搭配 tee 時我卻發現我指定的 log File 常常沒有內容,或是該出現的訊息很晚才出現,研究後才知道原來 Python 的 print 函式會判斷輸出的環境,如果是輸出到 Shell 的話會立刻輸出,但如果不是輸出到 Shell 則會先存在 Buffer,等緩衝區滿了再一次輸出,當你把 Python 搭配 tee 使用時就會遇到緩衝區的問題,導致預期的輸出沒有及時出現在螢幕和檔案中。
標籤: Python
Python Generate Datetime Series
在 Excel 很簡單的拖曳就可以產生連續的日期們,而在 Python 你可以利用 datetime 和 timedelta 兩個模組做到類似的事情,不管是要間隔一小時、間格一天、間隔一個月都可以做到。
Python 3 在 Windows 命令提示字元輸出時遇到 CP950 錯誤
今天在教學弟妹寫程式時,用 Python 印出一段中文字到命令提示字元,卻遇到「UnicodeEncodeError: ‘cp950’ codec can’t encode character」這個錯誤,嘗試了各種方法都無法解決,最後爬了文章才搞懂是怎麼回事。
看到這段錯誤,有經驗的開發者直覺就會認定是字串裡面有特殊字元,立馬給它加上 ignore 參數卻沒有效果,我遇到的情況檢查後發現是一個日文字,但眾所皆知 Python 3 預設使用 Unicode 字串,不應該會有無法輸出的問題才對,又不是萬惡的 Big5…
千萬不要在迴圈裡面刪除陣列元素
「踩你千萬遍也不厭倦的愚蠢行為」,我一直以為錯誤的寫法只要遇過一次就會長記性,但今天在公司又踩地雷三小時,始終搞不懂問題在哪裡,最後很認真把程式碼重看過一次後發現… 原來又是一樣的問題。 一句話:「不要擅迴圈裡面刪除任何陣列元素」
Python Global Exception Handler
一般來說例外處理不會是全域性質的,因為當我們將例外處理套用到全域時,我們很難確認問題發生在哪裡並處理,但少數情況下我們會需要撰寫出這樣的程式碼,以這次為例,我用 Python 撰寫程式去處理 webhook,但因為伺服器那邊送來的資訊太多樣化,我需要在將任何例外發生的時候,能夠把當環境資料印出來,方便事後除錯,這種時候就確實該使用 Global Exception Hook 的技巧。
Python Join with Lambda – 更客製化的 Join
寫程式的人對 split()、join() 兩個東西肯定不陌生,在 Python 裡面我們可以透過 String.join(list) 把 List 合併成字串,例如 “,”.join([“A”, “B”, “C”]) 會回傳 “A,B,C” 字串,或是反過來透過 “A,B,C”.split(“,”) 來拆成 List,但你一定有過這樣的需求卻無法解決吧:
- 把字串合併但首字大寫
- List 裡面存的是數字,但 join 需要是字串才可以處理
這些問題可以透過 List Comprehension 解決,例如型態處理的部份可以像這樣撰寫語法:
nums = [1,2,3,4,5] nums_str = [str(num) for num in nums] print(",".join(nums_str))
但除了 List Comprehension 以外還有其他解法嗎? 你肯定也想過像 sort 那樣傳送 lambda function 給 join 吧!
Python 漢語拼音處理(姓名中翻英、地址中翻英)
今天幫同事處理大量的姓名、地址中翻英需求,研究了 Python 在漢語拼音方面的作法,畢竟你總不能一筆一筆複製到郵局或是網站上吧(笑),結果出乎意料的簡單,地址翻譯的部分透過各家的 Geocoder API 即可處理,漢語拼音則是有第三方的 Library 可以使用,而且翻譯效果還不錯,不能說盡善盡美,但搭配工人智慧足以彌補那小小的缺陷,畢竟如果要解決最後的小缺陷,可能要投入大量的資源、技術,導入機器學習的方法來處理(其實之後會有興趣做看看,畢竟在華文圈裡面好用的工具真的太少了)。
How to make elasticsearch.py Fast (Bulk Operate)
用 Python 操作 Elasticsearch 時不免俗的肯定會安裝官方推出的 elasticsearch.py,最近在用 Python 接收 Email Log 並寫入 Elasticsearch 時有蠻多心得可以分享的,大家都知道 AWS lambda 是用執行時間算錢的,所以在撰寫 AWS Lambda 時我可說是分秒必爭,看到執行超過 0.5 秒就各種吐血,所以從最開始的 .index 一筆一筆插入資料到 Elasticsearch,到後來用 streaming_bulk 處理,最後受不了用 parallel_bulk 混合 streaming_bulk 操作,以下就來聊聊這幾種方式的差異以及地雷吧!
Python Convert String to Boolean
今天在撰寫 AWS Lambda 時因為從環境變數讀取設定的關係,需要把字串轉成布林來做判斷,一般的想法不外乎 Python 會幫你轉換,或是用 bool(“True”) 轉換就可以,首先其實 Python 是不會幫你轉換的,這點很重要! Python 在形態方面其實是不會做自動轉換的,他只會很阿莎力的報錯,不過大家肯定想說用 bool() 轉換就沒問題了吧!? 事實上,這個地雷害我今天搞了半小時才解決…
How to use Python GroupBy Data (List+Dict)
用 Python 處理資料時,對資料的某個 Key 進行 GroupBy 是很常見的需求,例如分析 Email Log 時,想知道某個標題的發送統計數,或是列出每個標題的 Email Provider 前五名之類,就會需要對標題進行 GroupBy 的動作,在資料庫裡這是十分簡單的事情,但如果你不想丟資料庫的話呢?
除了 Pandas 這套超強的資料處理函式庫可以幫你之外,其實 Python 本身也有 GroupBy 可以使用哦!