1. 程式人生 > >玩Python遇到的問題一二三及解決辦法

玩Python遇到的問題一二三及解決辦法


最近要頻繁的玩Python,在這裡總結下遇到的一些問題,持續更新中。

問題一:python 2.7版本解決TypeError: ‘encoding’ is an invalid keyword argument for this function。

用Python2.7來開啟一些檔案的時候,經常出現以上的所表示的問題,如

data_file = open("F:\\MyPro\\data.yaml", "r", encoding='utf-8')

執行的時候報錯:TypeError: ‘encoding’ is an invalid keyword argument for this function。但在Py3中執行卻不會遇到這樣的問題


解決辦法:網上查詢一番後,改成如下這樣就可以搞定

import io
data_file = io.open("F:\\MyPro\\data.yaml", "r", encoding='utf-8')

至於原因根據報錯的資訊看也許跟Py2和Py3的API規定不同有關吧。

問題二:python讀取檔案時提示"UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 205: illegal multibyte sequence"

同樣事讀取檔案時,碰到的編碼問題。
解決辦法:

FILE_OBJECT= open('order.log','r', encoding='UTF-8')

只需要加入對應的encoding引數就OK了,對於Python中的編碼問題,有時候也很麻煩。不過這類問題一般百度下就能找到對應的解決辦法。

問題三:not enough arguments for format string

在Python中執行SQL的查詢語句的時候爆出這樣的錯誤,如
sql='select * from Teacher where Tname like \'%%'+ keyword +'%%\''。後來才知道出現這類問題,主要是字串中包含了%號,python 認為它是轉移符,而實際我們需要的就是%, 這個時候,可以使用%%來表示%。

問題四:輸出的資訊為轉義碼

# ((u'01', u'\u5f20\u4e09'), (u'04', u'\u5f20\u4e09\u4e30')) # (u'01', u'\u5f20\u4e09')

這種情況也只有在Py2中才會出現,Py3中是不會出現的。
解決辦法:將輸出的轉義碼通過以下的eval方法轉化為對應的中文。

 print(eval("u"+"\'"+exmple[1]+"\'"))

問題五:使用list的clear()方法時的注意點

最近在寫一段如下程式碼時:

for line in lines:
    # print(line)
    for x in jieba.lcut(line):
        # print(x)
        if x not in stopwords:
            text1.append(x)

    text2=text1
    corpora_documents.append(text2)
    # print(corpora_documents)
    text1.clear()

這裡由於型別轉化問題不能採用簡便的方法來直接分詞並剔除停詞,所以只能用這種方式來實現相同的功能,但是在實現的過程中,原本期望返回的corpora_documents是下圖所示的效果:
這裡寫圖片描述
但是卻得到了一組空的List。這讓博主很是鬱悶(畢竟博主之前是寫Java的,面相物件的思想“根深蒂固”,以為宣告出來一個新的text2物件,就會開闢一塊新的記憶體空間來儲存text2的內容,這樣text1和text2也就是值傳遞了而非引用傳遞,可是這是java的記憶體載入機制。。。),不過後來隨著博主無意間將最後一行程式碼改為:

text1=[]

得到了自己想要的結果,之後再分析原因的時候,發現博主沒有切換到Python的記憶體管理機制。其實整個過程對於Python來說記憶體管理如下:

for line in lines:
    # print(line)
    for x in jieba.lcut(line):
        # print(x)
        if x not in stopwords:
            text1.append(x)

    text2=text1#相當於將宣告的兩個物件的指標指向同一塊記憶體空間即text1所在的記憶體空間
    corpora_documents.append(text2)#Python採用的應該是延遲載入,也就是說這裡corpora_documents只是將指標指向了text2的記憶體地址,並沒有直接就將text2裡面的內容載入進來。
    # print(corpora_documents)
    text1.clear()#clear()就相當於擦除了text1中的內容,即text2指向了一個空的內容,由於Python延遲載入的特性也就造成了後面打印出來的corpora_documents的內容為空
    print(corpora_documents)

所以在使用clear()的時候一定要注意物件之間的關係,一不留神就會造成很大的損失。感覺這個問題好像在那本書中有提到,還得複習下基礎知識,很多問題只有不斷的Coding才能碰到,還是實踐太少,仍需繼續努力。

問題六:Python下呼叫json.dumps中文顯示問題解決辦法

最近在開發某個功能的時候,需要將前臺的資訊返回到後天處理後,以json字串的形式返回,但是返回的內容顯示在網頁中確實ASCII碼值,下面是這個問題的解決辦法:
配置下dumps方法中的ensure_ascii這個屬性!

data={"url":"http:www.dianwe.com","content":"採集Test","CreateTime":"2014-07-08 23:29"}  
bizResult= json.dumps(data, ensure_ascii=False)   
print(bizResult)  

這樣便不會轉為Ascii 編號了!

問題七:報錯:pymysql.err.OperationalError: (1040, ‘Too many connections’)

mysql資料庫 Too many connections
出現這種錯誤明顯就是 mysql_connect 之後忘記 mysql_close;我的情況是實現了自動更新本地資料庫在測試的時候每次更新後又忘記關閉對應的connect,當大量的connect之後,就會出現Too many connections的錯誤,mysql預設的連線為100個。只需在程式碼中新增對應的connect.close()方法即可。

問題八:ValueError: invalid literal for int() with base 10: “”

最近在寫程式碼的時候,突然爆出這樣錯誤,根據字面意思是型別轉化的問題,但是仔細檢查了程式碼,發現型別轉化沒有問題。無奈只能去求助度娘,很多部落格也說是型別轉換的問題。以下是某部落格的一個實驗:

>>> int('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''
>>>

>>> int("x")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'x'

從中可以看出這類錯誤就是字元無法轉換為int型。但是仍找不到對應的錯誤的位置在哪裡,剛好看看到一個建議:“為了避免類似錯誤,以後進行int型別轉換時,注意檢查,或者直接加try 捕獲下”

 # try:
        #     print(int(re.sub("\D", "", x)))
        # except ValueError:
        #     print("-"*40)
        #     print("異常值"+x)

一查竟讓多出了一些nan值:
在這裡插入圖片描述
但是後來去和資料做比對的時候,實在是也沒有發現有什麼nan值,這就很奇怪了,所以為了能讓程式跑下去,這裡就先省去了這個int的強制變換。