我正在尝试处理CSV文件并提取主机名,并将提取的内容保存到名为host_file1
的文件中,然后将该文件与已存在的文本文件即host_file2
进行比较,因此csv处理工作正常。
现在,正如我所说的,我想在两个文件之间进行主机名比较,我想要的是将host_file2
中的主机名与host_file1
进行匹配,因此如果host_file2
中的主机名但不要在host_file1
中打印主机名,不要同时打印两个文件中的主机名。
我已经尝试过以下设置方法,但是它所带来的区别不是我想要的。
#!/python/v3.6.1/bin/python3
from __future__ import print_function
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)
import pandas as pd
##### Python pandas, widen output display to see more columns. ####
pd.set_option('display.height', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('expand_frame_repr', True)
##################### END OF THE Display Settings ###################
df_csv = pd.read_csv(input("Please input the CSV File Name: "), usecols=['Platform ID', 'Target system address']).dropna()
hostData = df_csv[df_csv['Platform ID'].str.startswith("CDS-Unix")]['Target system address']
hostData.to_csv('host_file1', header=None, index=None, sep=' ', mode='a')
with open('host_file1', 'r') as f:
dataset1 = set(f)
with open('host_file2', 'r') as f:
dataset2 = set(f)
for i, item in enumerate(sorted(dataset1 ^ dataset2)):
print(str(item))
# shorter
"""
with open('host_file1') as f1, open('host_file2') as f2:
dataset1 = set(f1)
dataset2 = set(f2)
"""
两个不同的主机名文件:
host_file1
vmhost01
vmhost02
vmhost03
vmhost04
vmhost05
vmhost06
vmhost07
vmhost08
vmhost09
vmhost10
host_file2
vmhost01
vmhost02
vmhost03
vmhost04
vmhost05
vmserver01
vmhost07
vmhost08
vmserver02
vmhost10
所需结果:
vmserver01
vmserver02
答案 0 :(得分:1)
我认为您需要减去套:
for i, item in enumerate(sorted(dataset2 - dataset1)):
#alternative
#for i, item in enumerate(sorted(dataset2.difference(dataset1))):
print(str(item))
vmhost01
vmhost02
vmserver01
vmserver02
列表理解的最后一个解决方案:
s = set(dataset1)
out = [x for x in dataset2 if x not in s]
print (out)
['vmserver02', 'vmhost02', 'vmhost01', 'vmserver01']
答案 1 :(得分:1)
您可以对文件进行比较以查看结果
diff host_file1 host_file2
上面是unix命令。因此,您需要使用os或子进程在其中运行命令。
如果上面的不是文件而是数据帧,请在下面尝试
diff = (host_file1 != host_file2).any(1)
print diff
另一个解决方案,这两个数据框的列名应该相同。如果它们不同,则重命名其中一个使其与其他相同。
import pandas as pd
host_file1 = pd.read_excel("data.xlsx", sheet_name = 2)
print host_file1
host_file2 = pd.read_excel("data.xlsx", sheet_name = 3)
print host_file2
pd.concat([host_file1,host_file2]).drop_duplicates(keep=False)
答案 2 :(得分:1)
我认为您的代码太复杂了,下面的代码呢?
import csv
with open("test.csv", "r") as t1:
data1 = t1.read().split()
with open("test2.csv", "r") as t2:
data2 = t2.read().split()
//u can exchange data2 and data1 to get what in data1 and not in data2
print([item for item in data2 if item not in data1])
答案 3 :(得分:0)
您可以创建2个数据框,每个数据集一个,然后外部合并数据框并选择未标记为“两个”的数据框。
df = pd.merge(df1, df2, how='outer', indicator=True)
df = df.loc[df['_merge'] == 'right_only']
在此之后,您可以仅打印新的数据框。