Python读写文件的编码格式-UTF-8, GBK

做一个测试脚本,从文件夹A遍历所有的.txt格式文件,并打开文件逐行读取内容,写入到文件夹B里面。我们看读和写文件格式在是否指定为UTF-8时会发生什么错误。新建6个文件,汉字内容是“你好!”, 英文字符是"Hello"

代码如下

#coding=utf-8
#coding=gbk
import os 

RootDir   = R"E:2_PythonToolsFold-2A\"
TargetDir = R"E:2_PythonToolsFold-2B\"

def mkdir(path):
	path=path.strip()
	path=path.rstrip("\")
	isExists=os.path.exists(path)
	if not isExists:
		os.makedirs(path)

def del_file(path):
	ls = os.listdir(path)
	for i in ls:
		c_path = os.path.join(path, i)
		if os.path.isdir(c_path):
			del_file(c_path)
		else:
			os.remove(c_path)

def list_all_files(rootdir):
	_files = []
	list = os.listdir(rootdir)
	for i in range(0,len(list)):
		path = os.path.join(rootdir,list[i])
		if os.path.isdir(path):
			_files.extend(list_all_files(path))  
		if os.path.isfile(path):
			_files.append(path)
	return _files


 **********************************************************************************
 BEGIN
 **********************************************************************************
 
del_file(TargetDir)	
_fs = list_all_files(RootDir)
for i in range (0,len(_fs)):
	filepath = os.path.dirname(_fs[i])
	filename = os.path.basename(_fs[i])
	(shotname,extension) = os.path.splitext(filename);
	filepath_new=TargetDir+\+filepath.split(:)[-1]
	mkdir(filepath_new)
	**fr=open(_fs[i],r)
	fw=open(filepath_new+\+filename+"_tt",w)**
	s="YES"
	print(_fs[i])
	while s!="":
		s=fr.readline()
		#s.decode("utf8","ignore")
		fw.writelines(s)
	fr.close()
	fw.close()
  1. 不指定文件编码格式
fr=open(_fs[i],r)
fw=open(filepath_new+\+filename+"_tt",w)

运行错误:UTF-8汉字读错误

  1. 仅指定读文件格式为UTF-8
fr=open(_fs[i],r,encoding=utf-8)
fw=open(filepath_new+\+filename+"_tt",w)

运行错误:UTF-8乱码写错误

3.指定读写文件格式都为UTF-8

fr=open(_fs[i],r,encoding=utf-8)
fw=open(filepath_new+\+filename+"_tt",w,encoding=utf-8)

运行错误: ANSI格式汉字读错误 测试结果:

  1. 对于纯英文文本文件,无论文件本身是什么格式,py也不需指定读写格式,都能正确处理
  2. 当文件本身是UTF-8格式,且py指定读写格式都为UTF-8时,无论文件内容是英文,汉字,还是乱码都能正确读写
  3. 无论文件是什么格式,当py指定读格式为UTF-8时,无论文件内容是英文,汉字,都能正确读出。

总结:

  1. 用Python读文本文件或写一个新的文本文件时,应该指定为UTF-8格式。
  2. 用Python读非UTF-8格式的文本文件前,应该先转换成UTF-8格式。
经验分享 程序员 微信小程序 职场和发展