博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Python文档读取UTF-8编码文件问题
阅读量:4684 次
发布时间:2019-06-09

本文共 1984 字,大约阅读时间需要 6 分钟。

近来接到一个小项目,读取目标文件中每一行url,并逐个请求url,拿到想要的数据。

#-*- coding:utf-8 -*-class IpUrlManager(object):    def __init__(self):        self.newipurls = set()        #self.oldipurls = set()    def Is_has_ipurl(self):        return len(self.newipurls)!=0    def get_ipurl(self):        if len(self.newipurls)!=0:            new_ipurl = self.newipurls.pop()            #self.oldipurls.add(new_ipurl)            return new_ipurl        else:            return None    def download_ipurl(self,destpath):        try:            f = open(destpath,'r')            iter_f = iter(f)            lines = 0            for ipurl in iter_f:                lines = lines + 1                self.newipurls.add((ipurl.rstrip('\r\n'))            #log记录读取了多少行IP url            #print lines        finally:            if f:                f.close()

咋一眼看code写的没问题,每一个url 增加进newipurls set集合中。但是请求的过程中,requests.get后,会出现如下错误:

raise InvalidSchema("No connection adapters were found for '%s'" % url)

后来发现每次都是第一行的url请求失败。然后打印print 请求的url。也没发现异常。然后从根源上去找,好吧,print打印newipurls set集合看看。

果然,问题就在这里。

奇怪,为什么这个URL前面为默认加上了\xef\xbb\xbf 这几个字符呢?

 

上网看了一些资料,原来在python的file对象的readline以及readlines程序中,针对一些UTF-8编码的文件,开头会加入BOM来表明编码方式。

何为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。

怎么检测该文件是否为UTF-8 带BOM的呢?

import codecsdef download_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:        if f:            f.close()

引用codecs模块,来判断前三个字节是否为BOM_UTF8。如果是,则剔除\xef\xbb\xbf字节。

其实大家可以通过其他方式剔除BOM字节,我写的比较粗糙。

 

转载于:https://www.cnblogs.com/nx520zj/p/5869241.html

你可能感兴趣的文章
解读typescript中 super关键字的用法
查看>>
指定IE7(或其他版本)如何访问?
查看>>
iframe 自动适应页面高度
查看>>
eclipse环境下基于tomcat-7.0.82构建struts2项目
查看>>
input标签附带提示文字(bootstrap里面输入框的两侧同时添加额外元素)
查看>>
VHDL硬件描述语言学习笔记---VHDL语言要素
查看>>
某种密码(搜索专练)
查看>>
【BZOJ5305】【HAOI2018】—苹果树(组合数学)
查看>>
【BZOJ3821】【UOJ#46】【清华集训2014】—玄学(线段树分治)
查看>>
【leetcode 简单】 第八十三题 反转字符串中的元音字母
查看>>
【leetcode 简单】 第一百零八题 找到所有数组中消失的数字
查看>>
引用同一解决方案的类库工程不成功
查看>>
[转]单例模式中为什么用枚举更好
查看>>
selenium 获取断言信息
查看>>
c# 模拟get请求例子,演示Session会话状态。
查看>>
[.net 面向对象程序设计深入](0) 开篇
查看>>
C 多线程学习
查看>>
#Sam有话说#一握在手,话说十年
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>