我正在创建一个程序,以列出IP地址和LAN中连接的用户。我通过使用nmap获取数据来完成。接下来,我想使用熊猫或任何其他方式将结果数据更改为某个数据框。怎么做。
代码如下:
import pandas as pd
import subprocess
from subprocess import Popen, PIPE
import re
def ipget():
i = 'nmap -sP 192.168.1.*'
output = subprocess.getoutput(i)
a = str(output).replace("Nmap","").replace("Starting 7.01 ( https://nmap.org ) at","").replace("scan report for","").replace("Host is up","").replace("latency","").replace("done: 256 IP addresses ","")
data = re.sub(r"(\(.*?\)\.)", "", a)
print(data)
#df = pd.DataFrame(data, columns = ['User', 'IP_Address'])
#print (df)
ipget()
输出存储在数据中,它是一个字符串:
2019-05-21 18:19 IST
android-eb20919729f10e96 (192.168.1.8)
smackcoders (192.168.1.9)
princes-mbp (192.168.1.10)
shiv-mbp (192.168.1.15)
(4 hosts up) scanned in 18.35 seconds
要在数据框中创建所需的输出:
User IP_Address
android-eb20919729f10e96 192.168.1.8
smackcoders 192.168.1.9
princes-mbp 192.168.1.10
shiv-mbp 192.168.1.15
答案 0 :(得分:4)
说您有文字:
2019-05-21 18:19 IST
android-eb20919729f10e96 (192.168.1.8)
smackcoders (192.168.1.9)
princes-mbp (192.168.1.10)
shiv-mbp (192.168.1.15)
(4 hosts up) scanned in 18.35 seconds
使用正则表达式查找所需数据:
>>> ms = re.findall(r'\n([^\s]*)\s+\((\d+\.\d+\.\d+\.\d+)\)', text)
>>> ms
[('android-eb20919729f10e96', '192.168.1.8'),
('smackcoders', '192.168.1.9'),
('princes-mbp', '192.168.1.10'),
('shiv-mbp', '192.168.1.15')]
>>> df = pd.DataFrame(ms, columns=['User', 'IP_Address'])
与其他答案的比较:
str.replace
每次调用运行一次,因此正则表达式解决方案可以为长日志提高效率。
答案 1 :(得分:3)
使用StringIO
import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
import pandas as pd
a="""
android-eb20919729f10e96 (192.168.1.8)
smackcoders (192.168.1.9)
princes-mbp (192.168.1.10)
shiv-mbp (192.168.1.15)"""
TESTDATA = StringIO(a)
df = pd.read_csv(TESTDATA, sep=" ",names=['User','IP_Address'])
在下面的行中添加以删除(
和)
import re
df.IP_Address = df.IP_Address.map(lambda x:re.sub('\(|\)',"",x))
答案 2 :(得分:2)
假设您的字符串命名为s
,以下代码将满足您的要求:
line_list = []
# iterate over each line
for line in s.split("\n"):
#remove empty lines
if line == '':
continue
#replace ( and ) with empty strings
line = line.replace("(", "").replace(")", "")
line_list.append(line)
# remove first and last line
line_list = line_list[1:-1]
array = []
# split lines by " "
for line in line_list:
array.append(line.split(" "))
# create dataframe
pd.DataFrame(array, columns = ["User", "IP_Adress"])
使用列表综合功能,您可以像单线飞机一样进行操作:
pd.DataFrame([line.replace("(", "").replace(")", "").split(" ") for line in s.split("\n") if line != ""][1:-1], columns = ["User", "IP_Adress"])