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.')
Python中可避免读写乱码的一个强慷慨法的更多相关文章
- 【python系统学习17】python中的文件读写
python中的文件读写 文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本.音频片段.Excel文档.邮件以及任何保存在电脑上的东西. 可使用python批量的操作本地文件, ...
- python中的文件读写(open()函数、with open('file_directory','r') as f:、read()函数等)
python中也有文件读写,通过调用内置的读写函数.可以完成文件的打开/关闭.读.写入.追加等功能. open()函数 open()函数为python中的打开文件函数,使用方式为: f = open( ...
- python中操作excel数据 封装成一个类
本文用python中openpyxl库,封装成excel数据的读写方法 from openpyxl import load_workbook from openpyxl.worksheet.works ...
- 『无为则无心』Python基础 — 41、Python中文件的读写操作(一)
目录 1.文件操作步骤 2.文件的读写操作 (1)文件的打开 (2)打开文件模式 (3)获取一个文件对象 (4)关于文件路径 1.文件操作步骤 当我们要读取或者写入文件时,我们需要打开文件,在操作完毕 ...
- python中如何不区分大小写的判断一个元素是否在一个列表中
python中判断某一个元素是否在一个列表中,可以使用关键字in 和 not in. 示例如下: 如果需要输出相应的信息,可以搭配使用if语句,这里不赘述. --------------------- ...
- python中如果函数后面有多于一个括号是怎么回事?
一般而言,调用一个函数是加一个括号.如果看见括号后还有一个括号,说明第一个函数返回了一个函数,如果后面还有括号,说明前面那个也返回了一个函数.以此类推. 比如fun()() def fun(): pr ...
- Python中subprocess 模块 创建并运行一个进程
python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex ...
- Python中文件的读写操作的几种方法
对文件的操作,步骤为:打开一个文件-->读取/写入内容-->保存文件 文件读写的3中模式 # 1.w 写模式,它是不能读的,如果用w模式打开一个已经存在的文件,会清空以前的文件内容,重新写 ...
- Python中文件的读写操作
文件操作基本流程: 1. 介绍 计算机系统是由计算机硬件,操作系统,和应用程序三部分组成. 内存 存放不持久 硬盘 可以使数据持久化 文件操作 数据持久化的一种 全栈开发 框架类 2. 文件的操作 ...
随机推荐
- Centos7最小化安装后再安装图形界面
1. yum -y groupinstall "X Window System" 2. yum -y groupinstall "GNOME Desktop" ...
- mysql中group by和order by混用 结果不是理想结果
在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是理想中的结果,那么怎么才能使用group by 和order by得到理想中的数据结果呢? 例如 有一个 ...
- Springboot 获取yml、properties参数
获取properties或yml文件的配置数据(两种方法)(默认的application文件或者自定义的yml和properties) 1.使用@Value()注解 1.1 配置数据 如:在prope ...
- LoadRunner使用教程
1.了解Loadrunner 1.1 LoadRunner 组件有哪些? LoadRunner 包含下列组件: ➤ 虚拟用户生成器用于捕获最终用户业务流程和创建自动性能测试脚本(也称为虚拟用户脚本). ...
- 洛谷 P1324 矩形分割
P1324 矩形分割 题目描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块. 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切 ...
- <LeetCode OJ> 20. Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- hdu1234 开门人和关门人 (等价转换)
开门人和关门人 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- Android学习笔记进阶19 之给图片加边框
//设置颜色 public void setColour(int color){ co = color; } //设置边框宽度 public void setBorderWidth(int width ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 2(Binary Trees)
112 - Tree Summing 题目大意:给出一个数,再给一颗树,每个头节点的子树被包含在头节点之后的括号里,寻找是否有从头节点到叶子的和与给出的数相等,如果有则输出yes,没有输出no! 解题 ...
- 搭建Spark源码研读和代码调试的开发环境
转载自https://github.com/linbojin/spark-notes/blob/master/ide-setup.md 搭建Spark源码研读和代码调试的开发环境 工欲善其事,必先利其 ...