把文件每行后面的数字去掉 以及 python读写文件时的编码问题

本文介绍了在Python中处理文件时遇到的编码问题,特别是'gbk'编码错误。通过以二进制模式打开文件并使用split函数删除每行后的数字。同时,文章详细解释了编码和解码过程,以及如何正确写入UTF-8编码的文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结写在前面:

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'换行。

 

### Python读取TXT文件去除空白行 为了实现Python读取TXT文件中的每一行并且去掉其中的空白行,可以采用如下方法: 通过`with open()`语句打开目标文本文件,在此过程中指定编码防止乱码问题出现。利用for循环迭代遍历文件对象返回的每一行内容,并调用`.strip()`方法移除字符串头尾可能出现的多余空白字符(如换行符、制表符以及空格)。如果经过处理后的行不是空串,则将其视为有效数据进行保存或立即打印出来。 ```python # 打开文件以只读方式 with open('example.txt', 'r', encoding='utf-8') as file: # 逐行读取文件内容 for line in file: stripped_line = line.strip() if stripped_line != "": print(stripped_line) ``` 上述代码片段展示了如何有效地过滤掉所有的空白行[^2]。 另外一种做法是先一次性加载整个文件到内存中形成列表形式存储各行文字,之后再创建一个新的列表仅保留非空的内容项。这种方法适用于较小规模的数据集,因为对于非常大的文件可能会消耗较多资源。 ```python # 打开文件 with open('example.txt', 'r', encoding='utf-8') as file: # 使用readlines()获取所有行 lines = file.readlines() cleaned_lines = [] for line in lines: clean_line = line.strip() if clean_line: # 如果该行不为空则加入新列表 cleaned_lines.append(clean_line) # 或者更简洁的方式使用列表推导式完成相同逻辑 cleaned_lines = [line.strip() for line in lines if line.strip()] print("\n".join(cleaned_lines)) ``` 这里不仅实现了去除非空行的功能还运用了更加紧凑优雅的一行表达式来简化程序结构[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值