大跌眼鏡:python print竟然不能輸出二進制內容

從來都沒有一把由壞鋼鑄成的好刀----本傑明·富蘭克林

大家好,我是一個專業的python後臺研發高級工程師,本質上並不是一個小編,但是有時候老闆也會要求我來寫寫文章。

我在這個團隊裡面最主要的工作就是寫python代碼了,大家在文章中看到的代碼,很多都是我寫出來的哦。

前幾天收到一個朋友的私信,他使用python開發cgi程序(這個方向實在是比較冷門),在讀取png文件並輸出的時候,遇到了讓人無法理解的兩個bug,小編花了一上午的時間,各種查資料,終於幫他解決了問題。


大跌眼鏡:python print竟然不能輸出二進制內容


朋友們若是有程序方面的問題也可以私信小編的哦,小編有空的時候一定會幫忙解決的。另外,私信小編還可以領取優美的簡歷模板哦。

python讀取文件的幾種方式

說到python讀取文件,趁這個機會,小編也總結了一下,大概有下面幾種方法:

f.read() 讀取文件中全部內容,它通過一次性讀取文件的所有內容放在一個大字符串中,即存在內存中。為了讓內存不至於爆掉,可以加參數表示讀取最多多少個字節。

f.read()的優勢:方便、簡單;一次性讀出文件放在一個大字符串中,速度最快。

f.read()的弊端:文件過大的時候,佔用內存會過大。

f.readline() 讀取文件一行。第一次調用的時候,讀的是第一行,第二次再調用,讀的就是第二行了。

f.readline()的優勢:佔用內存小,逐行讀取。

f.readline()的弊端:由於是逐行讀取,讀取速度比較慢。

上面兩種方法返回的都是字符串。


大跌眼鏡:python print竟然不能輸出二進制內容


f.readlines() 讀取文件中全部內容,返回的是一個數組,文件中的每行內容就對應數組中的每個元素。

這種方法讀取的文本內容,每行文本末尾都會帶一個'\\n'換行符 (可以使用L.rstrip('\\n')去掉換行符。

readlines()的利端:一次性讀取文本內容,速度比較快。

readlines()的弊端:隨著文本的增大,佔用內存會越來越多。

os.read() 與 f.read()類似,也是讀取文件中的全部內容,也可以加參數表示讀取最多多少個字節。


大跌眼鏡:python print竟然不能輸出二進制內容


os.read()的奇葩問題

os.read()看起來與f.read()是相同的功能,尤其是在讀取文本文件的時候,效果是完全相同的。

但是,在讀取二進制文件的時候, 由於os.open()並不支持以二進制方式打開文件,導致的問題就是os.read()讀不了二進制文件。

小編在windows10,python3.7的環境下測試了一把,使用os.read去讀取一個png文件,結果只讀到了四個字符出來,讓人很是無語。


大跌眼鏡:python print竟然不能輸出二進制內容


print()的奇葩問題

私信裡面這位朋友在調用print()的時候也遇到了奇葩的問題。

print只能輸出字符串。不能輸出二進制內容。

解決的辦法就是用sys.stdout.buffer.write。


大跌眼鏡:python print竟然不能輸出二進制內容


debug cgi程序的小技巧

接下來,小編講一講如何debug cgi程序(不限於python的cgi),php/c/c++都可以使用這些小技巧。

1)仔細閱讀cgi相關的文檔,是的,很多時候我們遇到的bug都是低級錯誤,在cgi文檔裡面都有寫過。

2)絕大部分http server對於 cgi程序的輸出都是有buffer的。 如果cgi程序執行到一半就有了輸出,那麼瀏覽器是看不到的,直到cgi程序執行結束之後,才會顯示全部的輸出。

3)仔細檢查http server的出錯日誌。日誌雖然不是萬能的,但沒有日誌是萬萬不能的。


大跌眼鏡:python print竟然不能輸出二進制內容


4)cgi程序一定要先在本地運行一下,確保無錯誤之後,再放到http server裡面通過瀏覽器訪問。

5)python cgi程序可以加上 import cgitb; cgitb.enable() 來定位問題。

6)如果需要在cgi程序裡面調用外部程序,一定要使用絕對路徑。

7)如果需要在cgi程序中讀寫文件,一定要檢查文件的權限和owner。


分享到:


相關文章: