我相信大家都遇到这种情况,但是很多人也不知道为什么。所以说我也讲(水)一下(文章)。
故事也是今天说起,今天我那边同学在部署项目说这边有个错误看一下。
Traceback (most recent call last):
File "run.py", line 28, in
dict_user = cfg.read_user()
File "T:\wdnmd\config_loader.py", line 71, in read_user
dict_user = toml.load(f)
File "C:\Users\admin\AppData\Local\Programs\Python\Python38\lib\site-packages\toml\decoder.py", line 134, in load
return loads(f.read(), _dict, decoder)
File "C:\Users\admin\AppData\Local\Programs\Python\Python38\lib\site-packages\toml\decoder.py", line 227, in loads
original, i)
toml.decoder.TomlDecodeError: Found invalid character in key name: '['. Try quoting the key name. (line 1 column 2 char 1)
然后我喵了一眼以为是配置文件格式错误了,排除问题后以为是编码错误,后来叫他用UTF-8保存一下文件。结果还是个鸟样子。
后来发现他用Windows记事本编辑文件我去。所以说为什么Windows自带的文件会出这种问题。
当我们用记事本的时候,随便编辑一个,保存为UTF-8文件,然后用winhex打开查看。
不难发现Windows自带的记事本,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
这就相当于这本来就是我的最终版作业答案,你却打上了自己的标记说是你的。(我相信大家小时候有这种偷别人完成作业的想法)
它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP来说,BOM是个大麻烦。
Python读取文件时候,也会造成很多麻烦。如果要用读取这类文件的话,得用这种方法打开。
with open('文件.txt', encoding='utf-8-sig') as f: dic_user = toml.load(f)
所以说为啥不自动检测该文件是什么编码再读取呢?
要是有这种闲事情还不如去优化代码,付出的精力还不如去修个BUG(搞砸了说不定还弄出一堆新BUG)。
这就是为什么大佬叫我们当在Windows运行项目的时候一定一定为啥不要用Windwos自带的记事本编辑配置文件。
当然,新版本的Windwos记事本(目前我用的是版本1909 (OS内部版本18363.720))已经解决了这个问题,保存的时候会看到几个选项了。
所以说我就好奇这么久了巨硬的程序猿没发现这个问题呢?到了2020年才解决。
(标题为什么这么长,我也不知道呢~)
第一次写科普向文章,有错误还是请大佬指出。( ̄▽ ̄)~*