使用python将GBK编码文档转化为UTF编码

使用python将GBK编码文档转化为UTF编码

  • 使用python将GBK编码文档转化为UTF编码
    • 文件操作说明(python3)
    • 编码问题
    • 对文件夹内的文件进行批量操作

文件操作说明(python3)

这部分简单介绍接下来会用到的函数

#open操作创建一个file对象,参数可为r,w,r+,w+,rb
#其中r+和w+不同之处在于r+文件必须事先存在,w+不用
#使用rb参数后 .read()会以bytes方式打开(后面会详说bytes)
open('file.c', 'r')

#也可以指定打开的编码
#但要注意rb方式是不能指定encoding方法的
content=open('file.c', 'r', encoding='utf-8')

# 这两种read方式对于小文件没什么区别
content.read()
content.readlines()

# write的参数必须为str类,这与默认read()的返回类型相同,都是unicode的
open('file.c','w').write(content+'其他')

编码问题

编码问题是一个很头疼的问题,在不同操作系统,不同国家,python不同版本都会存在.

首先明白一点,python编码问题是unicode和byte字符串转化直接的问题!
在python2中,Unicode字符串和 byte 字符串是可以混合的,系统试图帮你解决一切,但这往往带来更大的麻烦。类似于int和fload之间的转换,双向转换并不可行.

来自wiki和网上文档的说明:

Python 2 悄悄掩盖了 byte 到 unicode 的转换,让程序在处理 ASCII 的时候更加简单。你付出的代价就是在处理非 ASCII 的时候将会失败。

Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分,文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.在python3中文本和二进制数据作了更为清晰的区分,不再会对bytes字节串进行自动解码。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示

虽然不是标准,但许多Windows程序(包括Windows记事本)在UTF-8编码的文件的开首加入一段字节串EF BB BF。这是字节顺序记号U+FEFF的UTF-8编码结果。对于没有预期要处理UTF-8的文本编辑器和浏览器会显示成ISO-8859-1字符串。

简单来说:
Python 2 将 strings 处理为原生的 bytes 类型,而不是 unicode,
Python 3 所有的 strings 均是 unicode 类型。

理解了这点后,就可以进行编码转换了,简言之就是直接decode()成Unicode,然后open()中指定编码即可,两句话的事
但是在python2中,需要进行decode('GBK').encode('utf-8')一系列操作

content =open('333.c','rb',encoding='gbk').read()  #content为byte流
new_content=content.decode('gbk')   #以gbk解码以得到Unicode,可以直接write了
open('222.c','w',encoding='utf-8').write(new_content)   #在这里编码就行,

#或者
#采用r+或者w+的方式只能进行一次open操作,open之后再怎么鼓捣数据
# #最后还是会以Unicode方式write,相当于做了无用功,所以必须进行两次open
content =open('111.c','r',encoding='gbk').read()
content.close()
open('111.c','w',encoding='utf-8').write(content)

对文件夹内的文件进行批量操作

接下来就简单了,使用os.listdir()并遍历所有文件.

如果有文件夹直接跳过,只对文件进行操作( 对.tar .rar压缩包会判断为文件,但gbk解码失败会调到异常处理,所以不用担心 )

因为中间有的文件可能已经是utf-8 编码了,所以 try 并抛出错误 except.

import os
path = 'E:\\Python\\untitled'      #文件夹目录
files= os.listdir(path)             #得到文件夹下的所有文件名称
for file in files:                  #遍历文件夹
     if not os.path.isdir(file):    #判断是否是文件夹,不是文件夹才打开
         try:
             fGBK = open(path+'\\'+file,'r',encoding='gbk')  #尝试打开文件,打不开说明不是gbk编码,进入异常处理
             content = fGBK.read()  # 无异常则继续转换
             fGBK.close()
             fUTF = open(path + '\\' + file, 'w', encoding='utf-8')
             fUTF.write(content)
             fUTF.close()
             print(file + '已经转换为UTF-8')
         except:
             print(file + '不是GBK编码')

你可能感兴趣的:(使用python将GBK编码文档转化为UTF编码)