從來都沒有一把由壞鋼鑄成的好刀----本傑明·富蘭克林
大家好,我是一個專業的python後臺研發高級工程師,本質上並不是一個小編,但是有時候老闆也會要求我來寫寫文章。
我在這個團隊裡面最主要的工作就是寫python代碼了,大家在文章中看到的代碼,很多都是我寫出來的哦。
前幾天收到一個朋友的私信,他使用python開發cgi程序(這個方向實在是比較冷門),在讀取png文件並輸出的時候,遇到了讓人無法理解的兩個bug,小編花了一上午的時間,各種查資料,終於幫他解決了問題。
朋友們若是有程序方面的問題也可以私信小編的哦,小編有空的時候一定會幫忙解決的。另外,私信小編還可以領取優美的簡歷模板哦。
python讀取文件的幾種方式
說到python讀取文件,趁這個機會,小編也總結了一下,大概有下面幾種方法:
f.read() 讀取文件中全部內容,它通過一次性讀取文件的所有內容放在一個大字符串中,即存在內存中。為了讓內存不至於爆掉,可以加參數表示讀取最多多少個字節。
f.read()的優勢:方便、簡單;一次性讀出文件放在一個大字符串中,速度最快。
f.read()的弊端:文件過大的時候,佔用內存會過大。
f.readline() 讀取文件一行。第一次調用的時候,讀的是第一行,第二次再調用,讀的就是第二行了。
f.readline()的優勢:佔用內存小,逐行讀取。
f.readline()的弊端:由於是逐行讀取,讀取速度比較慢。
上面兩種方法返回的都是字符串。
f.readlines() 讀取文件中全部內容,返回的是一個數組,文件中的每行內容就對應數組中的每個元素。
這種方法讀取的文本內容,每行文本末尾都會帶一個'\\n'換行符 (可以使用L.rstrip('\\n')去掉換行符。
readlines()的利端:一次性讀取文本內容,速度比較快。
readlines()的弊端:隨著文本的增大,佔用內存會越來越多。
os.read() 與 f.read()類似,也是讀取文件中的全部內容,也可以加參數表示讀取最多多少個字節。
os.read()的奇葩問題
os.read()看起來與f.read()是相同的功能,尤其是在讀取文本文件的時候,效果是完全相同的。
但是,在讀取二進制文件的時候, 由於os.open()並不支持以二進制方式打開文件,導致的問題就是os.read()讀不了二進制文件。
小編在windows10,python3.7的環境下測試了一把,使用os.read去讀取一個png文件,結果只讀到了四個字符出來,讓人很是無語。
print()的奇葩問題
私信裡面這位朋友在調用print()的時候也遇到了奇葩的問題。
print只能輸出字符串。不能輸出二進制內容。
解決的辦法就是用sys.stdout.buffer.write。
debug cgi程序的小技巧
接下來,小編講一講如何debug cgi程序(不限於python的cgi),php/c/c++都可以使用這些小技巧。
1)仔細閱讀cgi相關的文檔,是的,很多時候我們遇到的bug都是低級錯誤,在cgi文檔裡面都有寫過。
2)絕大部分http server對於 cgi程序的輸出都是有buffer的。 如果cgi程序執行到一半就有了輸出,那麼瀏覽器是看不到的,直到cgi程序執行結束之後,才會顯示全部的輸出。
3)仔細檢查http server的出錯日誌。日誌雖然不是萬能的,但沒有日誌是萬萬不能的。
4)cgi程序一定要先在本地運行一下,確保無錯誤之後,再放到http server裡面通過瀏覽器訪問。
5)python cgi程序可以加上 import cgitb; cgitb.enable() 來定位問題。
6)如果需要在cgi程序裡面調用外部程序,一定要使用絕對路徑。
7)如果需要在cgi程序中讀寫文件,一定要檢查文件的權限和owner。
閱讀更多 python碼神 的文章