2018-06-13 11:20:40
在windows上使用open打开utf-8编码的txt文件时开头会有一个多余的字符,它叫BOM,是用来声明编码等信息的,但python会把它当作文本解析
解决办法:open的encoding参数
1.创建config.ini配置文件
[DATABASE] host = 50.23.190.57 username = xxxxxx password = ****** port = 3306 database = databasename [HTTP] # 接口的url baseurl = https://xxxxxxxxx port = 8080 timeout = 1.0 [EMAIL] mail_host = smtp.163.com mail_user = xxx@163.com mail_pass = ********* mail_port = 25 sender = xxx@163.com receiver = xxxx@qq.com/xxxx@qq.com subject = python content = "All interface test has been complited please read the report file about the detile of result in the attachment." testuser = Someone on_off = 1
2.读取config.ini配置文件
import os import codecs import configparser #获取当前文件__file__的所在目录 proDir = os.path.split(os.path.realpath(__file__))[0] #获取文件 cfg.ini 的地址 configPath = os.path.join(proDir, "config.ini") print(configPath) class ReadConfig: def __init__(self): self.cf = configparser.ConfigParser() self.cf.read(configPath) def get_email(self, name): value = self.cf.get("EMAIL", name) return value def get_http(self,name): value = self.cf.get("HTTP", name) print(value) return value def get_db(self, name): value = self.cf.get("DATABASE", name) return value
运行结果报错:
在首行添加 #coding=gbk,其余代码均不变
#coding=gbk 固定编码格式为 gbk import os import codecs import configparser
运行结果报错:
用encoding参数读取文件
#coding=gbk import os import codecs import configparser #获取当前文件__file__的所在目录 proDir = os.path.split(os.path.realpath(__file__))[0] #获取文件 cfg.ini 的地址 configPath = os.path.join(proDir, "config.ini") print(configPath) class ReadConfig: def __init__(self): self.cf = configparser.ConfigParser() self.cf.read(configPath,encoding='utf-8') #encoding='utf_8_sig'
运行结果成功:
3.utf-8 与 utf-8-sig两种编码格式的区别
UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一様的,没有字节序的问题,也因此它实际上并不需要BOM(“ByteOrder Mark”), 但是UTF-8 with BOM即utf-8-sig需要提供BOM("ByteOrder Mark")
这里我不是很理解,反正在这里无论用那种编码格式都可以
self.cf.read(configPath,encoding='utf-8') #encoding='utf_8_sig'
# 执行zip压缩命令,将apitest目录下所有文件打包压缩 source =[back_dir,back_file] target_file=target_dir+time.strftime("%Y%m%d%H%M%S")+'.zip' zip_commond ="zip -qr "%s" "%s""%(target_file,''.join(source)) print(zip_commond) if os.system(zip_commond)==0: print('Successful backup to',target_file) else: print('Backup Failed')