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$
完美!