1. 程式人生 > 程式設計 >解決Python 寫檔案報錯TypeError的問題

解決Python 寫檔案報錯TypeError的問題

處理上傳的檔案:

 f1 = request.FILES['pic']
 fname = '%s/%s' % (settings.MEDIA_ROOT,f1.name)
 with open(fname,'w') as pic:
  for c in f1.chunks():
  pic.write(c)

測試報錯:

TypeError at /upload/

write() argument must be str,not bytes

把之前的開啟語句修改為用二進位制方式開啟:

 f1 = request.FILES['pic']
 fname = '%s/%s' % (settings.MEDIA_ROOT,'wb+') as pic:
  for c in f1.chunks():
  pic.write(c)

沒有問題了~

補充知識:python3使用pickle讀取檔案提示TypeError或者UnicodeDecodeError的解決辦法

python的pickle模組實現了基本的資料序列和反序列化。通過pickle模組的序列化操作我們能夠將程式中執行的物件資訊儲存到檔案中去,永久儲存;通過pickle模組的反序列化操作,我們能夠從檔案中建立上一次程式儲存的物件。

python2使用的是cPickle模組,而在python3中cPickle已經被取消,取而代之的是pickle模組。

開發過程中,我曾經遇到一個奇怪的問題,在讀取一個檔案時候,使用python2的如下方式:

import cPickle

train,test,dicts = cPickle.load(open("./dataset/atis.pkl"))

是可以正常讀取檔案的。

可是當換做python3的方式讀取檔案時候,如下:

import pickle

train,dicts = pickle.load(open("./dataset/atis.pkl"))

卻獲得了錯誤提示,提示資訊如下:

Traceback (most recent call last):

File “Main.py”,line 4,in

train,dicts = pickle.load(open(“./dataset/atis.pkl”))

TypeError: ‘str' does not support the buffer interface

查詢錯誤資訊後得知解決辦法 連結,應該指明用二進位制方式開啟檔案,於是程式碼改為:

import pickle

train,dicts = pickle.load(open("./dataset/atis.pkl","rb"))

可是這時候錯誤變成了:

Traceback (most recent call last):

File “Main.py”,dicts = pickle.load(open(“./dataset/atis.pkl”,“rb”))

UnicodeDecodeError: ‘ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)

於是再次求助萬能的google,終於找到了解決辦法 連結,我們需要告訴pickle:how to convert Python bytestring data to Python 3 strings,The default is to try and decode all string data as ASCII,所以程式碼改為:

import pickle

train,"rb"),encoding='iso-8859-1')

問題終於的到了解決。

以上這篇解決Python 寫檔案報錯TypeError的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。