Python:从多个创建输出CSV。 VLOOKUP

时间:2018-05-22 16:12:24

标签: python python-2.7

我正在尝试从一个CSV文件中获取数据,并将该数据的相应信息放在另一个CSV文件中,并将它们合并到输出文件中。

让我们说这是我的查找文件:

Name.csv:

Product[] productArr = (Product[]) productList.toArray();

这是另一个csv文件,我将从中获取服务器,IP地址等的相关信息

Main.csv

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

我想要的是将这两个信息合并到一个新的excel表(csv)中,基本上是一个VLOOKUP,请帮助Python Coders!我需要一个代码和解释,这样我将来可以轻松地进行Vlookup。

这是我尝试过的代码:

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

我得到的错误是:

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)

1 个答案:

答案 0 :(得分:0)

我没有专门为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']]

你可以通过列表理解使这更加pythonic:

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

最终得分

引用this post

  

在Python 2中,zip返回元组列表。这个很好,当foo和   酒吧不是很大。如果它们都是巨大的那么形成   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:])的原因是消除第一行"行" (列表)数据是标题,因为它们不是我们正在处理的数据。