Обработайте файл CSV с помощью Pandas и сравните вывод обработанного файла с существующим файлом - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь обработать CSV-файл и извлечь имена хостов и сохранить извлечение в файл с именем host_file1, а затем сравнить этот файл с уже существующим текстовым файлом, например host_file2, поэтому обработка csv работает нормально.

Теперь, как я уже сказал, я хочу сделать некоторое сравнение имени хоста между двумя файлами, я хочу, чтобы сопоставить имя хоста в host_file2 с host_file1, поэтому, если имя хоста в host_file2, но не в host_file1 печать имени хоста, не печатайте имя хоста, которое есть в обоих файлах.

Я пробовал что-то подобное ниже с set, но это просто дает разницу, а не то, что я хочу.

#!/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 голосов
/ 11 декабря 2018

Я думаю, ваш код настолько сложен, как на счет кода ниже:

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])
0 голосов
/ 11 декабря 2018

Вы можете выполнить diff для файлов, чтобы увидеть результат

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)
0 голосов
/ 11 декабря 2018

Вы можете создать 2 фрейма данных, по одному для каждого набора данных, а затем выполнить внешнее объединение фреймов данных и выбрать те, которые не помечены как «оба».

df = pd.merge(df1, df2, how='outer', indicator=True)
df = df.loc[df['_merge'] == 'right_only']

После этого вы можете просто напечататьновый фрейм данных.

0 голосов
/ 11 декабря 2018

Я думаю, вам нужно вычесть наборы:

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...