1. 编码方式
编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
不同编码的文本,是根据文本的前两个字节来定义其编码格式的,定义如下:
ANSI: 无格式定义;
Unicode: 前两个字节为FFFE;
Unicode big endian: 前两字节为FEFF;
UTF-8: 前两字节为EFBB;
这样通过前面两个字节就可以判定出文件的具体格式了。
实现文件的转换!直接贴代码,一看就明白了!
# UTF-8文件转 ANSI
#coding:utf-8
import chardet
import codecs
file_path1 = "1.txt"
file_path2 = "2.txt"
# 查看文件编码方式..............................................................
f1=open(file_path1,'r')
data1=f1.read()
print (chardet.detect(data1))
f1.close()
#读入utf-8.....................................................................
f1 = codecs.open(file_path1, 'r')
data1 = f1.read()
print data1
#创建ansi文件..................................................................
fh = codecs.open(file_path2,'w', 'GBK')
fh.write(data1.split('\xbf',1)[1].decode('utf8'))
#反复试验发现读入的内容中包含了\xef\xbb\xbf,应该是所读文件头的信息,导致在后面写入时无法识别
#所以把前面分开就好了
#str_str=u'abcd1234中文'
#fh.write(str_str)
#fh.write(u'中文')
fh.close()
f1.close()
写入字符串都可以,就是在写入从文件读出来的数据时出错!
文本格式对应表
ANSI---->GBK
UTF-8---->UTF-8
Unicode---->UTF-16
#!/usr/bin/env python
#coding:utf-8
#保存unicode格式
fh = codecs.open("xxx.txt","w","utf-16")
fh.write(str_str.decode("utf-8"))
fh.close()
#保存ANSI格式
fh = codecs.open("xxx.txt","w","GBK")
fh.write(str_str.decode("utf-8"))
fh.close()
#保存utf-8格式
fh = codecs.open("xxx.txt","w","UTF-8")
fh.write(str_str.decode("utf-8"))
fh.close()
#这里默认文本格式是utf-8,编码是utf-8
文件读写模式
见下表,其中模式就是指获取文件对象时传入的参数,最常用的是前三个。
模式 | 描述 |
---|---|
r | 仅读,待打开的文件必须存在 |
w | 仅写,若文件已存在,内容将先被清空 |
a | 仅写,若文件已存在,内容不会清空 |
r+ | 读写,待打开的文件必须存在 |
w+ | 读写,若文件已存在,内容将先被清空 |
a+ | 读写,若文件已存在,内容不会清空 |
rb | 仅读,二进制,待打开的文件必须存在 |
wb | 仅写,二进制,若文件已存在,内容将先被清空 |
ab | 仅写,二进制,若文件已存在,内容不会清空 |
r+b | 读写,二进制,待打开的文件必须存在 |
w+b | 读写,二进制,若文件已存在,内容将先被清空 |
a+b | 读写,二进制,若文件已存在,内容不会清空 |