Python 转换文本编码实现解析

作者:danvy617 时间:2022-07-15 15:58:49 

最近在做周报的时候,需要把csv文本中的数据提取出来制作表格后生产图表。

在获取csv文本内容的时候,基本上都是用with open(filename, encoding ='UTF-8') as f:来打开csv文本,但是实际使用过程中发现有些csv文本并不是utf-8格式,从而导致程序在run的过程中报错,每次都需要手动去把该文本文件的编码格式修改成utf-8,再次来run该程序,所以想说:直接在程序中判断并修改文本编码。

基本思路:先查找该文本是否是utf-8的编码,如果不是则修改为utf-8编码的文本,然后再处理。

python有chardet库可以查看到文本的encoding信息:

detect函数只需要一个 非unicode字符串参数,返回一个字典(例如:{'encoding': 'utf-8', 'confidence': 0.99})。该字典包括判断到的编码格式及判断的置信度。


import chardet
def get_encode_info(file):
 with open(file, 'rb') as f:
   return chardet.detect(f.read())['encoding']

不过这个在从处理小文件的时候性能还行,如果文本稍微过大就很慢了,目前我本地的csv文件是近200k,就能明显感觉到速度过慢了,效率低下。不过chardet库中提供UniversalDetector对象来处理:创建UniversalDetector对象,然后对每个文本块重复调用其feed方法。如果检测器达到了最小置信阈值,它就会将detector.done设置为True。

一旦您用完了源文本,请调用detector.close(),这将完成一些最后的计算,以防检测器之前没有达到其最小置信阈值。结果将是一个字典,其中包含自动检测的字符编码和置信度(与charde.test函数返回的相同)。


from chardet.universaldetector import UniversalDetector
def get_encode_info(file):
with open(file, 'rb') as f:
   detector = UniversalDetector()
for line in f.readlines():
     detector.feed(line)
if detector.done:
break
   detector.close()
return detector.result['encoding']

在做编码转换的时候遇到问题:UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 178365: character maps to <undefined>


def read_file(file):
with open(file, 'rb') as f:
return f.read()
def write_file(content, file):
with open(file, 'wb') as f:
   f.write(content)
def convert_encode2utf8(file, original_encode, des_encode):
 file_content = read_file(file)
 file_decode = file_content.decode(original_encode)  #-->此处有问题
 file_encode = file_decode.encode(des_encode)
 write_file(file_encode, file)

这是由于byte字符组没解码好,要加另外一个参数errors。官方文档中写道:

bytearray.decode(encoding=”utf-8”, errors=”strict”)

Return a string decoded from the given bytes. Default encoding is 'utf-8'. errors may be given to set a different error handling scheme. The default for errors is 'strict', meaning that encoding errors raise a UnicodeError. Other possible values are 'ignore', 'replace' and any other name registered via codecs.register_error(), see section Error Handlers. For a list of possible encodings, see section Standard Encodings.

意思就是字符数组解码成一个utf-8的字符串,可能被设置成不同的处理方案,默认是‘严格'的,有可能抛出UnicodeError,可以改成‘ignore','replace'就能解决。

所以将此行代码file_decode = file_content.decode(original_encode)修改成file_decode = file_content.decode(original_encode,'ignore')即可。

完整代码:


from chardet.universaldetector import UniversalDetector

def get_encode_info(file):
with open(file, 'rb') as f:
  detector = UniversalDetector()
  for line in f.readlines():
    detector.feed(line)
    if detector.done:
      break
  detector.close()
  return detector.result['encoding']

def read_file(file):
 with open(file, 'rb') as f:
   return f.read()

def write_file(content, file):
 with open(file, 'wb') as f:
   f.write(content)

def convert_encode2utf8(file, original_encode, des_encode):
 file_content = read_file(file)
 file_decode = file_content.decode(original_encode,'ignore')
 file_encode = file_decode.encode(des_encode)
 write_file(file_encode, file)

if __name__ == "__main__":
 filename = r'C:\Users\danvy\Desktop\Automation\testdata\test.csv'
 file_content = read_file(filename)
 encode_info = get_encode_info(filename)
 if encode_info != 'utf-8':
   convert_encode2utf8(filename, encode_info, 'utf-8')
 encode_info = get_encode_info(filename)
 print(encode_info)

参考:https://chardet.readthedocs.io/en/latest/usage.html

来源:https://www.cnblogs.com/danvy/p/11417782.html

标签:python,转换,文本,编码
0
投稿

猜你喜欢

  • python sorted函数的小练习及解答

    2021-10-14 15:50:28
  • python封装对象实现时间效果

    2022-10-30 16:14:01
  • 对python中数据集划分函数StratifiedShuffleSplit的使用详解

    2022-12-04 23:10:28
  • Python用20行代码实现完整邮件功能

    2023-04-06 12:20:49
  • 解决MySQL不允许从远程访问的方法

    2010-03-18 15:39:00
  • 解决python 未发现数据源名称并且未指定默认驱动程序的问题

    2022-07-18 14:34:48
  • 通过Python扫描代码关键字并进行预警的实现方法

    2022-11-02 02:42:51
  • python实现定时发送邮件到指定邮箱

    2023-05-02 05:04:02
  • 一段查看ASP文件源码的ASP程序

    2007-09-21 12:53:00
  • python实现简单的学生管理系统

    2022-11-25 08:34:04
  • 如何利用python提取字符串中的数字

    2022-12-09 10:32:13
  • Python识别快递条形码及Tesseract-OCR使用详解

    2022-10-20 01:32:32
  • python利用socket实现udp文件传输功能

    2023-07-07 14:15:33
  • ASP简单实现数字和字母验证码

    2008-10-23 13:52:00
  • GoLang使goroutine停止的五种方法实例

    2023-09-02 08:31:33
  • python ftp 按目录结构上传下载的实现代码

    2021-01-28 00:38:33
  • Python实现批量导入1000条xlsx数据

    2021-01-11 05:55:47
  • pytorch使用tensorboardX进行loss可视化实例

    2021-04-07 20:17:36
  • php实现的验证码文件类实例

    2023-08-17 17:54:52
  • python如何支持并发方法详解

    2021-05-29 16:50:17
  • asp之家 网络编程 m.aspxhome.com