python3对文件编码的转换处理

摘要:
因此,有必要将UTF-8编码的文件转换为GBK。代码如下/usr/bin/python3#-*-coding:utf-8-*-#pythonfileConvasource_filedest_fileimportos,sysimportchardetsource_File=sys。argv[1]#源文件dest_文件=sys。argv[2]#转换后的目标文件#为rowinopen:tmp=charge确定源文件的字符代码。detectlanguage=tmp。getiflanguage Upper=='UTF-8':charset=“UTF-8”else:charset=”GB18030“break#使用openasfp:forrownop:fp将文件转换为GBK代码在转换生产数据时仍然有用,但某些字符无法很好地识别,导致转换失败。

  前言:

  公司同事邀我一起给SQLSERVER 2008导数, 数据来源有高斯和ORACLE, 数据文件保存格式有UTF-8和GBK。

  当我在做测试导入的时候发现SQLSERVER 2008数据库的WITH选项不支持CODEPAGE='65001', 即UTF-8文件编码格式导入。 所以需要把UTF-8编码的文件

统一转换成GBK, 代码如下。

 示例一:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# python fileConv source_file dest_file
import os, sys
import chardet

source_file = sys.argv[1]  # 源文件
dest_file = sys.argv[2] # 转后的目标文件

# 确定源文件字符编码
for row in  open(source_file, 'rb'):
    tmp = chardet.detect(row)
    language = tmp.get("encoding")
    if language.upper == 'UTF-8':
        charset = "UTF-8"
    else:
        charset = "GB18030"
    break

# 将文件转换成GBK编码
with open(dest_file, 'w', encoding="GB18030") as fp:
    for row in open(source_file,'r', encoding=charset):
        fp.write(row)

  

  在转换生产数据的时候还算好用, 但有些字符还是无法很好的识别, 导致转换失败。

 

在网上又看到了一个专门用来编码转换的包:codecs, 用法大同小异

示例二:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# python fileConv source_file dest_file
import os, sys
import chardet
import codecs

source_file = sys.argv[1]  # 源文件
dest_file = sys.argv[2] # 转后的目标文件

# 确定源文件字符编码
for row in  open(source_file, 'rb'):
    tmp = chardet.detect(row)
    language = tmp.get("language")
    if language == 'Chinese':
        charset = "GB18030"
    else:
        charset = "UTF-8"
    break

# 将文件转换成GBK编码
fp = codecs.open(dest_file, 'w', encoding="GB18030") # 中文编码写入
for row in codecs.open(source_file, 'r', encoding=charset): # 指定编码读
    fp.write(row)
fp.close()

  

知识小记:

通过 Unicode 编码来进行不同编码之间的相互转化

1、不同的编码之间不能互相识别,不能相互转化,会报错或出现乱码

2、国际通用标准:文字通过网络传输、或硬盘存储等不能使用 Unicode 编码方式,因为 Unicode 使用的是升级版 32 位的,太费流量和空间

3、在 Python3 版本中,唯独 string 在内存中的编码方式是 Unicode,所以字符串不能直接进行网络传输及进行文件的存储

4、bytes:也是一种数据类型,不是字节,与 string 类型就像是孪生兄弟

5、为啥要有 bytes ?—— bytes 内部编码不是 Unicode 方式,因此可以进行网络传输和文件的存储

6、不同编码之间相互转化都需要先变成unicode编码, encode编码, decode解码

示例:

s1 = "中国"
b=s1.encode("gbk")
s2 = b.decode("gbk")
s3=u"中国"
 
print(s1)
print(b)
print(s2)
print(s1==s2==s3)
 
结果 :
 
中国
b'xd6xd0xb9xfa'
中国
True

  

在python3版本中, 字符串的编码方式就是Unicode, 所以中国==u"中国"

各系统的默认编码方式

  WINDOWS: GBK

  LINUX: UTF-8

  IOS: UTF-8

示例:

# windows下生成的文件打开方式
with open(r"d:	est.txt") as fp:
    print(fp.read())
 
 
# linux下生成文件的打开方式
with open(r"d:	est.txt", encoding="utf-8") as fp:
    print(fp.read())

  如果encoding不对, 打开内容是乱码

免责声明:文章转载自《python3对文件编码的转换处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决webstorm卡顿问题GNU LD 脚本学习笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python3之并发(七)---线程同步队列(queue)

queue模块实现了多生产者,多消费者队列 queue模块的常用类和异常 queue.Queue(maxsize=0) 先进先出(FIFO)的队列, maxsize: 队列的大小(即队列的元素个数),默认0,队列大小无限;如果超过maxsize,队列会加锁,添加新元素是被堵塞,直到队列中的元素小于maxsize queue.LifoQueue(maxsi...

C++用iconv进行页面字符转换

在对HTML页面进行爬取时,总会遇到一些不同的编码,而我们通常都不会一一对这些编码进行处理,而是集体转换成相同的编码,也易于装入数据库。此时,iconv便成为一个很方便的工具。 iconv 头文件"iconv.h"。iconv命令可以将一种已知的字符集文件转换成另一种已知的字符集文件。 它的作用是在多种国际编码格式之间进行文本内码的转换。 li...

【转】二维码生成原理

原文链接:QR码生成原理-QR Code(ISO 18004)编码方式 一、什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下: 这个图如果被正确解码,应该看到我的名字和邮箱。 二、QR码的特点 说到QR码的特点: 一是高速读取...

Python3 中 configparser 使用注意事项

在使用configparser时候应注意: ①配置文件(ini文件)的存放位置:配置文件和调用文件放在同一个文件包下面。 使用read()函数读取并解析配置文件时,直接写配置文件(ini文件)的文件名即可。 例如: cf=ConfigParser() #实例化cf.read("PageElementLocator.ini...

xxl-job 增加python3

xxl-job 项目中,可以定时执行python脚本,但默认都是使用linux系统自带的python2.7执行脚本,与常用且常写的python3不符。本文主要解决这个问题。 解决方案 修改直接修改 com.xxl.job.core.glue.GlueTypeEnum 这个枚举即可。比如我在这个枚举新增了一个python3,既不影响之前的python2.x脚...

pipreqs 报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 966: illegal multibyte sequence

Outline 在通过pipreqs对项目创建依赖环境文件时(requirements.txt),报了编码错误; 这里解决下这个问题。 pipreqs基本使用 安装: pip install pipreqs 使用: pipreqs 指定文件生成路径 # 如此就会把 requirements.txt 文件生成到你指定的目录下,一般放在项目根目录下 问题定位...