1、实验环境
1.1、场景设计
我在一个文本中存放了一些IP跟端口的信息,文本内容如下:
现在我需要把文本跟端口进行切割,然后再打印切割后的数据并进行变量赋值,源码如下:
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)
也就是把打印的变量独立出来,不作为
%
的引用,然后运行,得出的结果如下:
此时可以看出,在每一行后面都有一个转义,也就是换行符,所以这个换行符就把符号的后一部分换行到下一行了,所以出现了符合不对称的问题,既然问题找到了,那么就解决一下!
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 baidaliuyi@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 = str.replace(li, "", "") 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)
运行结果如下:
这时候就完美解决了输出格式问题