总结写在前面:
python读取文件文件时,如果出现 'gbk' codec can't decode byte 0xac in position 7482: illegal multibyte sequence编码错误
在读取文件的后面加一个b表示用二进制文件的格式打开with open(path,'rb') as file
假设读取出来的文件放在line里面,我们要使用line时,需要解码decode
line.decode()
今天拿到一个文件,里面的东西是这样的
^https?://[^/]+/$ 10050
^https?://[^/]+/?(\?|$) 10040
^https?://[^/]+/.*\.(php|aspx|asp|jsp|do|dwr|cgi|fcgi|action|ashx|axd|json)(\?|$) 6997
^https?://[^/]+/(([^/]+/)*[^(.|/|?)]+($|\?)|([^/]+/)*$) 5394
^https?://[^/]+/.*(\?|$) 5348
大概有接近十万条,我只需要里面的那些每条前面的正则表达式,后面出现的数字怎么出来的我也不知道,
总之我就需要把每条后面的数字去掉,比较庆幸的是每串数字前面都有几个tab空格,于是就可以想到用Python读取文件然后用.split('\t'),想得倒是很简单,做起来却没有那么顺利,python3的编码问题搞得新手有点烦。
下面贴出代码
def func(path):
result = []
with open(path,'rb') as file: #--------------------------------1
for f in file.readlines():
f_arr = f.split(b'\t') #----------------------------------2
result.append(f_arr[0])
with open('b.txt','w',encoding = 'utf-8') as file: #-----------3
for line in result:
file.write(line.decode()+'\n') #----------------------4
print("success")
def main():
path = 'a.txt'
func(path)
if __name__ == "__main__":
main()
1处我们如果只写with open(path,'r') as file
那么就会报错 'gbk' codec can't decode byte 0xac in position 7482: illegal multibyte sequence
错误的意思是:Unicode的解码(Decode)出现错误(Error)了,以gbk编码的方式去解码(该字符串变成Unicode),但是此处通过gbk的方式,却无法解码(can’t decode )。“illegal multibyte sequence”意思是非法的多字节序列,即没法(解码)了。
此种错误,可能是要处理的字符串本身不是gbk编码,但是却以gbk编码去解码 。比如,字符串本身是utf-8的,但是却用gbk去解码utf-8的字符串,所以结果不用说,则必然出错。
我们加上b,以bytes形式进行读取就不会出错,因为是以bytes形式,所以下面的.split(b'\t')分隔时'\t'也要以bytes格式,所以2处需要b'\t'
3处的encoding('utf-8')是写入编码格式为'utf-8'很好理解,如果不加会出现上面1的问题。
4处line我们读取时是bytes格式,所以通过decode()变为'utf-8',加上'\n'换行。