使用Pandas处理CSV文件,并将处理后的文件输出与现有文件进行比较

时间:2018-12-11 08:44:21

标签: python pandas

我正在尝试处理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

4 个答案:

答案 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']

在此之后,您可以仅打印新的数据框。