關於Python文件讀取UTF 8編碼檔案問題

2022-03-10 12:52:53 字數 2270 閱讀 9501

近來接到乙個小專案,讀取目標檔案中每一行url,並逐個請求url,拿到想要的資料。

#

-*- coding:utf-8 -*-

class

ipurlmanager(object):

def__init__

(self):

self.newipurls =set()

#self.oldipurls = set()

defis_has_ipurl(self):

return len(self.newipurls)!=0

defget_ipurl(self):

if len(self.newipurls)!=0:

new_ipurl =self.newipurls.pop()

#self.oldipurls.add(new_ipurl)

return

new_ipurl

else

:

return

none

defdownload_ipurl(self,destpath):

try:

f = open(destpath,'r'

) iter_f =iter(f)

lines =0

for ipurl in

iter_f:

lines = lines + 1self.newipurls.add((ipurl.rstrip(

'\r\n'))

#log記錄讀取了多少行ip url

#print lines

finally

:

iff:

f.close()

咋一眼看code寫的沒問題,每乙個url 增加進newipurls set集合中。但是請求的過程中,requests.get後,會出現如下錯誤:

後來發現每次都是第一行的url請求失敗。然後列印print 請求的url。也沒發現異常。然後從根源上去找,好吧,print列印newipurls set集合看看。

果然,問題就在這裡。

奇怪,為什麼這個url前面為預設加上了\xef\xbb\xbf 這幾個字元呢?

上網看了一些資料,原來在python的file物件的readline以及readlines程式中,針對一些utf-8編碼的檔案,開頭會加入bom來表明編碼方式。

所謂bom,全稱是byte order mark,它是乙個unicode字元,通常出現在文字的開頭,用來標識位元組序(big/little endian),除此以外還可以標識編碼(utf-8/16/32)。

其實如果大家有ultraedit tool可以發現,在另存為檔案的時候,可以儲存為utf-8 和utf-8 無bom的檔案。

如果將檔案另存在utf-8的格式,則檔案的開頭缺省會增加三個位元組\xef\xbb\xbf。

import

codecs

defdownload_ipurl(self,destpath):

try:

f = open(destpath,'r'

) iter_f =iter(f)

lines =0

for ipurl in

iter_f:

lines = lines + 1

if ipurl[0:3] ==codecs.bom_utf8:

self.newipurls.add((ipurl.rstrip(

'\r\n

')).lstrip('

\xef\xbb\xbf'))

#print self.newipurls

#log記錄讀取了多少行ip url

#print lines

finally

:

iff:

f.close()

引用codecs模組,來判斷前三個位元組是否為bom_utf8。如果是,則剔除\xef\xbb\xbf位元組。

其實大家可以通過其他方式剔除bom位元組,我寫的比較粗糙。

python讀取excel文件

1.公升級pip指令python m pip install upgrade pip檢視已安裝的擴充套件包pip list2.安裝xlrd模組pip install xlrd3.執行例項 注意生成的碟符預設f盤根目錄import xlrd book xlrd.open workbook r f te...

python讀取pdf文件 實戰

coding utf 8 讀取pdf文件 from pdfminer.converter import pdfpageaggregator from pdfminer.layout import laparams from pdfminer.pdfparser import pdfparser,pd...

用python讀取pdf文件

首先要安裝庫 pdfminer3k from pdfminer.converter import pdfpageaggregator from pdfminer.layout import laparams from pdfminer.pdfparser import pdfparser,pdfdo...