一起学Python-通过replace实现Shell脚本中sed替换功能

1、实验环境

1.1、场景设计

我在一个文本中存放了一些IP跟端口的信息,文本内容如下:

liuyi@l:/media/liuyi/数据/编程学习/源码/python/for$ more list.txt 
qq.com 80
g.cm 90
baidu.com 443

现在我需要把文本跟端口进行切割,然后再打印切割后的数据并进行变量赋值,源码如下:

from os import path
#设置文件path变量
url_file = "./list.txt"
#判断文件是否存在
if path.exists(url_file):
    #打开文件
    file = open(url_file, "r", encoding='utf-8')
    #遍历文件行内容
    for (num, li) in enumerate(file, 1):
        print("正在检测第[ %s ]行内容: [ %s ] " %(num, li))
        xi = li.split(' ', 2)
        xi2 = [li]
        for i in xi2:
            domain_port = i.split(' ')
            domain = domain_port[0]
            port = domain_port[1]
            print("第[ %s ]行获取的域名:[ %s ] " %(num, domain))
            print("第[ %s ] 行获取的端口:[ %s ] " %(num, port))
            print(domain)
            print(port)
    file.close()
else:
    exit("找不到文件[%s]" %url_file)

可是在打印的过程中出现了预期之外的现象,如下:
在这里插入图片描述

可以看出,下面这个符合出现了不该有的断层

[]

作为强迫症患者,这怎么能忍受呢!

2、查找问题

程序出了问题,最好的解决办法就是一点一点的还原最初的信息,所以我们可以先看一下获取到的整行内容有什么,所以代码修改成这样:

from os import path
#设置文件path变量
url_file = "./list.txt"
#判断文件是否存在
if path.exists(url_file):
    #打开文件
    file = open(url_file, "r", encoding='utf-8')
    #遍历文件行内容
    for (num, li) in enumerate(file, 1):
        print("正在检测第[ %s ]行内容: [ %s ] " ,(num, li))
        xi = li.split(' ', 2)
        xi2 = [li]
        for i in xi2:
            domain_port = i.split(' ')
            domain = domain_port[0]
            port = domain_port[1]
            print("第[ %s ]行获取的域名:[ %s ] " ,(num, domain))
            print("第[ %s ] 行获取的端口:[ %s ] " ,(num, port))
            print(domain)
            print(port)
    file.close()
else:
    exit("找不到文件[%s]" %url_file)

也就是把打印的变量独立出来,不作为

%s

的引用,然后运行,得出的结果如下:

liuyi@l:/media/liuyi/数据/编程学习/源码/python/for$ python3 read_line.py 
正在检测第[ %s ]行内容: [ %s ]  (1, 'qq.com 80\n')[ %s ]行获取的域名:[ %s ]  (1, 'qq.com')[ %s ] 行获取的端口:[ %s ]  (1, '80\n')
qq.com
80

正在检测第[ %s ]行内容: [ %s ]  (2, 'g.cm 90\n')[ %s ]行获取的域名:[ %s ]  (2, 'g.cm')[ %s ] 行获取的端口:[ %s ]  (2, '90\n')
g.cm
90

正在检测第[ %s ]行内容: [ %s ]  (3, 'baidu.com 443\n')[ %s ]行获取的域名:[ %s ]  (3, 'baidu.com')[ %s ] 行获取的端口:[ %s ]  (3, '443\n')
baidu.com
443

liuyi@l:/media/liuyi/数据/编程学习/源码/python/for$ 

此时可以看出,在每一行后面都有一个转义,也就是换行符,所以这个换行符就把符号的后一部分换行到下一行了,所以出现了符合不对称的问题,既然问题找到了,那么就解决一下!

3、解决问题

3.1、解决思路

对于此类问题,我在编写shell脚本的过程中也会遇到,所以如果是换到shell语言的话,一个sed就解决了,也就是通过替换,那么在Python也是一样的,虽然工具有点不一样,但是解决的思路是一致的。

3.2、解决工具

在Python中,处理字符串替换的工具是str.replace,菜鸟教程解释链接如下:https://www.runoob.com/python/att-string-replace.html
通过菜鸟教程的案例,可以看出语法是非常的简洁的,但是在这个案例中使用的只是其中一个语法,另一个语法如下:

str.replace("str", "old", "new")

举个例子:

liuyi@l:~$ more d.py 
li = 'baidu'
lis = str.replace(li, "du", "da")
print(lis)

执行结果如下:

liuyi@l:~$ python3 d.py 
baida
liuyi@l:~$ 

3.2.1、增加str.replace语句

代码改造如下:

from os import path
#设置文件path变量
url_file = "./list.txt"
#判断文件是否存在
if path.exists(url_file):
    #打开文件
    file = open(url_file, "r", encoding='utf-8')
    #遍历文件行内容
    for (num, li) in enumerate(file, 1):
        li = replace(li, "\n", "")
        print("正在检测第[ %s ]行内容: [ %s ] " %(num, li))
        xi = li.split(' ', 2)
        xi2 = [li]
        for i in xi2:
            domain_port = i.split(' ')
            domain = domain_port[0]
            port = domain_port[1]
            print("第[ %s ]行获取的域名:[ %s ] " %(num, domain))
            print("第[ %s ] 行获取的端口:[ %s ] " %(num, port))
            print(domain)
            print(port)
    file.close()
else:
    exit("找不到文件[%s]" %url_file)

运行结果如下:

liuyi@l:/media/liuyi/数据/编程学习/源码/python/for$ python3 read_line.py 
正在检测第[ 1 ]行内容: [ qq.com 80 ][ 1 ]行获取的域名:[ qq.com ][ 1 ] 行获取的端口:[ 80 ] 
qq.com
80
正在检测第[ 2 ]行内容: [ g.cm 90 ][ 2 ]行获取的域名:[ g.cm ][ 2 ] 行获取的端口:[ 90 ] 
g.cm
90
正在检测第[ 3 ]行内容: [ baidu.com 443 ][ 3 ]行获取的域名:[ baidu.com ][ 3 ] 行获取的端口:[ 443 ] 
baidu.com
443
liuyi@l:/media/liuyi/数据/编程学习/源码/python/for$ 

完美!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐公交也用券

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值