近來接到乙個小專案,讀取目標檔案中每一行url,並逐個請求url,拿到想要的資料。
#咋一眼看code寫的沒問題,每乙個url 增加進newipurls set集合中。但是請求的過程中,requests.get後,會出現如下錯誤:-*- 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()
後來發現每次都是第一行的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模組,來判斷前三個位元組是否為bom_utf8。如果是,則剔除\xef\xbb\xbf位元組。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()
其實大家可以通過其他方式剔除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...