关于Python文档读取UTF-8编码文件问题

近来接到一个小项目,读取目标文件中每一行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 codecs
def 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字节,我写的比较粗糙。

时间: 2024-10-13 22:56:45

关于Python文档读取UTF-8编码文件问题的相关文章

征python文档撰写技术员

最近频繁使用python,一些不懂的东西就要查一下,好几次到了官网,查了半天都放弃了,直接google了....哎...被Qt的文档宠坏了...如果有python爱好者和我有一样的想法,希望在有生之年再也不用饱受官网文档的折磨的,请联系我([email protected]),我们一起to make life better. 要求:至少要会英文吧,文笔简练,行文流畅,最好是落笔生花的. 声明:这个一个非盈利活动,具体开工日期等人数凑齐再说,另外提供pythoner职位两枚,工作地点武汉,待遇优厚

matlab txt文档读取

下面这个函数是取filein中的第line行写入fileout中的程序,如果想实现取特定几行,只要稍微修改一下就可以. function dataout=dataread(filein,fileout,line) fidin=fopen(filein,'r'); fidout=fopen(fileout,'w'); nline=0;  while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行 nline=nline+1; if nlin

可视化webpart基础开发——TreeView控件读取文档库中的所有文件夹和文件(递归方法读取)

可视化webpart基础开发——TreeView控件读取文档库中的所有文件夹和文件(递归方法读取) 分类: SharePoint2011-12-23 14:44 1584人阅读 评论(0) 收藏 举报 文档sharepointurl测试stringforms 可视化webpart基础开发——TreeView控件读取文档库中的所有文件夹和文件(递归方法读取) 1.在部署的sharepoint网站中新建一个名为“测试文档库”的文档库,并添加各级的子文件夹和子文件,用于测试 2.在VS2010中新建空

9.9 Python 文档字符串

9.9 Python 文档字符串. 进入 Python 标准库所在的目录. 检查每个 .py 文件看是否有__doc__ 字符串, 如果有, 对其格式进行适当的整理归类. 你的程序执行完毕后, 应该会生成一个漂亮的清单. 里边列出哪些模块有文档字符串, 以及文档字符串的内容. 清单最后附上那些没有文档字符串模块的名字. import os #import pdb path2search = '/System/Library/Frameworks/Python.framework/Versions

Apache PDFbox开发指南之PDF文档读取

转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51542309 相关文章: <Apache PDFbox开发指南之PDF文本内容挖掘> < Apache PDFbox开发指南之PDF文档读取> 1.介绍 Apache PDFbox是一个开源的.基于Java的.支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容.Apache PDFBox还包含了数个命令行

框架优化系列文档:SVN中非版本控制文件忽略上传的设置

对于SVN代码库,只应该上传源代码.资源文件等内容进行版本管理,通常编译后的二进制文件.程序包等生成产物是不应该放到SVN上做版本管理的.因此在svn的客户端工具中设置svn的属性:svn:ignore,使本地工作目录下的哪些目录或文件不用进行版本管理,这样在本地对这些内容进行添加.修改等操作时,SVN都会对其忽略. 优点:     1.减少SVN服务器中无用文件的数量.     2.保证每次下载源代码都可以重新编译,减少因为临时文件造成的编译错误.     3.避免开发人员误将不用版本管理的内

Word文档如何转换成PDF文件

Word文档是一种好编辑又好保存的文档,大家日常生活接触的也比较多.但随着PDF文件使用范围越来越广泛,很多Word文档大家都喜欢用PDF的格式来保存,这样安全性更高.接下来小编就介绍一下Word文档如何转换成PDF文件.1.格式之间的转换,就需要准备第三方操作工具来进行就会事半功倍,小伙伴们可自行在百度浏览器搜索PDF转换器将其下载下来安装到电脑上.2.鼠标双击打开转换器,直接进入操作页面,在操作页面的左边有五个功能,小伙伴们根据转换需要用鼠标点击选中第二个功能其他文件转PDF.3.点击其他文

doxygen + doxypypy + docstring 生成python文档

1 原生doxygen对python注释的文档化支持情况 默认情况下,doxygen可以同时支持两种风格的python注释,原生的docstring和类似java doc风格的##.不过实际使用时不是十全十美 """@package docstring Documentation for this module. More details. """ def func(): """Documentation for a

Python文档

详细的为代码编写文档,这其实是写好代码的重要部分. 常见编写代码的陷阱: 1.别忘了冒号.一定要记住在复合语句首行末未输入":" 2.从第一行开始.要确定顶层(无嵌套)程序代码从第一行开始.这包括在模块文件中输入的无嵌套的代码,以及在交互模式提示符下输入的无嵌套的代码 3.空白行在交互模式提示符下很重要.模块文件中符合语句内的空白行都会被忽略,但是,交互模式提示符下输入代码时,空白行则是会结束语句. 4.缩进要一致.避免在块缩进中混合制表符和空格.每个块全都使用制表符或空格,这样比较安