Python中可避免读写乱码的一个强大方法

昨天在帮同学解析一批从网络上爬取的文件时,遇到一个奇葩的问题,文件本身的编码是gbk,Eclipse编辑环境的默认编码是utf8,使用常规的open方法批量打开文件时,某些文件中存在一些不可被gbk识别的特殊字符导致读取错误,而这些特殊字符又是存在于utf8编码中的。经不断尝试,发现一个很好的解决办法:使用Python自带的codecs。codecs就是为编码转码而生的,关于此功能的更多详情请移步 https://docs.python.org/3.2/library/codecs.html

# -*- coding: utf8 -*-
#以下代码要实现的效果是将gbk编码的文件批量转存为utf8编码的文件
import os;
import codecs;
from bs4 import BeautifulSoup;

#以gb18030编码读文件的函数
def ReadFile(filePath,encoding="gb18030"): #注意这里的编码格式
    with codecs.open(filePath,"r",encoding) as f:
        return f.read()

#以utf8编码重新写文件的函数
def WriteFile(filePath,u,encoding="utf-8"):
    with codecs.open(filePath,"w",encoding) as f:
        f.write(u)

fileList=os.listdir("E:/content/"); #获取原文件列表
for eachFile in fileList: #遍历文件名
    temp=ReadFile("E:/content/"+eachFile); #读文件
    WriteFile(‘E:/content_0629/‘+eachFile, temp, "utf8"); #将读取的内容转存为utf8编码的文件
print(‘finished.‘)

另外,文件完成转存之后,在使用BeautifulSoup进行解析时,想过滤掉一些噪声信息,完整代码如下:

# -*- coding: utf8 -*-
import os;
from bs4 import BeautifulSoup;
n=0;

fileList=os.listdir("E:/content_0629");
for eachFile in fileList:
    n=n+1; #设置文件序号

    rawText= open(r"E:/content_0629/"+eachFile,‘r‘,encoding=‘utf8‘);#读文件
    bs4Text=BeautifulSoup(rawText);#调用BeautifulSoup进行解析

    title=bs4Text.find(‘h2‘); #h2标签中放的是文章正文标题
    if(title==None): #判断标题标签是否存在,如果不存在则忽略当前文件
        continue;
    else:
        title=title.get_text(); #获取标题内容文本
        title=title.replace(" ","");#替换掉其中的全角空格
        title=title.replace(" ","");#替换掉其中的半角空格        

    mainContent=bs4Text.find(‘div‘,{‘class‘:‘content‘}); #根据标签名和标签属性值获取正文内容标签
    if(mainContent==None):#判断此标签是否存在,如果不存在则忽略当前文件
        continue;
    else:
        mainContent=mainContent.get_text();
        mainContent=mainContent.replace(" ","");
        mainContent=mainContent.replace(" ","");
        mainContent=mainContent.replace("\t","");
        mainContent=‘\n‘.join(mainContent.split()) #将多个连续的空行替换为一个空行

    #将解析后的文本保存到文件中,仍以utf8编码
    fwriter=open(‘E:/result_0629/resutl_‘+str(n)+".txt",‘w‘,encoding=‘utf8‘);
    fwriter.write(title+"\n"+mainContent);
    fwriter.close();    

print(‘finished.‘)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 22:01:57

Python中可避免读写乱码的一个强大方法的相关文章

Python中文件的读写操作的几种方法

对文件的操作,步骤为:打开一个文件-->读取/写入内容-->保存文件 文件读写的3中模式 # 1.w 写模式,它是不能读的,如果用w模式打开一个已经存在的文件,会清空以前的文件内容,重新写# w+ 是读写内容,只要沾上w,肯定会清空原来的文件# 2.r 读模式,只能读,不能写,而且文件必须存在# r+ 是读写模式,只要沾上r,文件必须存在# 3.a 追加模式,也能写,在文件的末尾添加内容# 4.rb+.wb+.ab+,这种是二进制模式打开或者读取,一些音乐文件 test1.txt 如果无情的风

Python中转变大小写的直接函数有以下方法

Python中转变大小写的直接函数有以下方法: upper()--所有字母大写 lower()--所有字母小写 capitalize()--首字母大写,其他字母小写 title()--所有单词首字母大写,其他小写 下面来看一个例子, 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.如输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart'] 1. 如果想要用title()函数,必须把列表写为字符串的形式,如下 2. 还可以用m

python中如何不区分大小写的判断一个元素是否在一个列表中

python中判断某一个元素是否在一个列表中,可以使用关键字in 和 not in. 示例如下: 如果需要输出相应的信息,可以搭配使用if语句,这里不赘述. ------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------

python中如果函数后面有多于一个括号是怎么回事?

一般而言,调用一个函数是加一个括号.如果看见括号后还有一个括号,说明第一个函数返回了一个函数,如果后面还有括号,说明前面那个也返回了一个函数.以此类推. 比如fun()() def fun(): print("this is fun"); def _fun(): print("this is _fun"); return _fun; Your task is to write a higher order function for chaining together

python中try except处理程序异常的三种常用方法

如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序: try: 语句1 语句2 ... 如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序: 1 2 3 4 5 6 7 8 try:     语句1     语句2     .     .     语句N except .........:     do something ....... 但是你并不知道"语句1至语句N"在执行会出什

Python中Pickle模块的dump()方法和load()方法

Python中的Pickle模块实现了基本的数据序列与反序列化. 经常遇到在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据. 这个时候Pickle模块就派上用场了,它可以将对象转换为一种可以传输或存储的格式. 一.dump()方法 pickle.dump(obj, file, [,protocol]) 注释:序列化对象,将对象obj保存到文件file中去.参数protocol是序列化模式,默认是0(ASCII协

Python中迭代输出(index,value)的几种方法

需求如下:迭代输出序列的索引(index)和索引值(value). 1.创建测试列表: >>> lst = [1,2,3,4,5] 2.实现方法如下: #方法1:range()+len() >>> for i in range(len(lst)): print i,lst[i] 0 1 1 2 2 3 3 4 4 5 #方法2:enumerate() >>> for index,value in enumerate(lst): print index,

Python中subprocess 模块 创建并运行一个进程

python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex cmd = "cat test.txt; rm test.txt" call(cmd, shell=True) 运行之后: 1:打开并浏览了test.txt文件 2:删除了test.txt文件 from subprocess import call import shlex cmd = &

使用python中的smtplib库,写一个简单的发送qq邮件程序,速成!!

#-*-coding:utf-8-*- import smtplib from  smtplib import SMTP_SSL from email.mime.text import MIMEText from email.header import Header #定义一个字典存储发送和接收,邮箱账号密码主题.内容及编码相关信息 mail_info = {     "from": "[email protected]",  #发件人     "to&q