使用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编码')