Python: создание выходного CSV из нескольких.ВПР - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь извлечь данные из одного CSV-файла и поместить соответствующую информацию об этих данных, которая находится в другом CSV-файле, и объединить их в выходной файл.

Допустим, это мой поисковый файл:

Name.csv:

+------+
|CI_Name|
+------+
| a    |
| b    |
| c    |
| ...  |
+------+

Это еще один CSV-файл, откуда я получу соответствующую информацию о сервере, IP-адресе и т. Д.

Main.csv

+------+--------+------------+
|CI_Name | Server | IP-Address |
+------+--------+------------+
| a    |        |            |
| b    |        |            |
| c    |        |            |
| ...  |        |            |
+------+--------+------------+

Я хочу объединить эти две информации в новый лист Excel (CSV), в основном VLOOKUP. Пожалуйста, помогите программистам Python!Мне нужен код и объяснение, чтобы в будущем я мог с легкостью выполнять Vlookup.

Это код, который я пробовал:

import csv

with open('Name.csv', 'r') as csvinput:
    with open('Main.csv', 'r') as lookuplist:
        with open('Output.csv', 'w') as output:

            reader = csv.reader(lookuplist)
            reader1 = csv.reader(csvinput)
            writer = csv.writer(output)

            for CI_Name in reader1:
                for SERVER, FQDN, AUTOMATION_ADMINISTRATOR, IP_ADDRESS, PRIMARY1, MHT_1, MHT_2, MHT_3, MHT_4 in reader: #this are the columnss i need to match from the Main and import it to the output.csv
                    if CI_Name[0] == FQDN[0]:
                        CI_Name.append(FQDN[1:])
                        writer.writerow(CI_Name)

Ошибка, которую я 'м получается:

for SERVER, FQDN, AUTOMATION_ADMINISTRATOR, IP_ADDRESS, PRIMARY1, MHT_1, MHT_2, MHT_3, MHT_4 in reader:
ValueError: too many values to unpack

1 Ответ

0 голосов
/ 23 мая 2018

Я не работал специально для CSV, однако мне пришлось использовать python для генерации документов для листов Google, при этом данные выглядели бы примерно так, где по сути каждый список представляет собой строку:

names = [['Name'], ['a'], ['b'], ['c']]

Возвращаясь к вашей проблеме, насколько я понимаю, вы хотите присоединиться к каждому из них, если они совпадают.

names = [['Name'], ['a'], ['b'], ['c']]
data = [['Name', 'Server', 'IP-Address'], ['a', 'server1', '127.0.0.1'], ['b', 'server1', '127.0.0.1'], ['c', 'server2', '0.0.0.1']]

joined_data = []
for name, data in zip(names[1:], data[1:]):
    if name in data:
        joined_data.append(data)

print joined_data

, который выдает следующий результат

[['a', 'server1', '127.0.0.1'], ['b', 'server1', '127.0.0.1'], ['c', 'server2', '0.0.0.1']]

Вы можете сделать это более питоническим с помощью понимания списка:

names = [['Name'], ['a'], ['b'], ['c']]
data = [['Name', 'Server', 'IP-Address'], ['a', 'server1', '127.0.0.1'], ['b', 'server1', '127.0.0.1']

joined_data = [data for name, data in zip(names[1:], data[1:]) if name[0] in data]
print joined_data

, который производит следующий вывод

[['a', 'server1', '127.0.0.1'], ['b', 'server1', '127.0.0.1'], ['c', 'server2', '0.0.0.1']]

Конечные точки

Как указано в этом посте :

В Python 2 zip возвращает список кортежей.Это хорошо, когда foo и bar не массивны.Если они оба массивные, то формирование zip (foo, bar) является излишне массивной временной переменной и должно быть заменено на itertools.izip

, что будет выглядеть примерно так:

import itertools

names = [['Name'], ['a'], ['b'], ['c']]
data = [['Name', 'Server', 'IP-Address'], ['a', 'server1', '127.0.0.1'], ['b', 'server1', '127.0.0.1']

joined_data = [data for name, data in itertools.izip(names[1:], data[1:]) if name[0] in data]
print joined_data

Наконец, причина, по которой я делаю ...zip(names[1:], data[1:]), состоит в том, чтобы исключить первую «строку» (список) данных, которые являются заголовками, поскольку они на самом деле не являются данными, с которыми мы имеем дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...