循环遍历大型csv python

时间:2012-10-16 16:51:48

标签: python

我有一个包含以下结构的大型csv文件(几百行):
filename,sitename,servername

这个csv文件包含几个双打,因为服务器名是来自群集的(总是相同的夫妻)和网站名的语言别名(例如,mijnhuis,myhouse,mamaison)

我希望得到的结果如下(注意;和,: 文件名; sitename1,sitename2,sitename3; servername1,servername2,servername3;

我怎样才能以最优化的方式做到这一点?

PS:实际代码会很好,但是如果你能给我指示,我会同样高兴。

4 个答案:

答案 0 :(得分:3)

使用风险自负:

import collections as c

f = open('input', 'r')
sites, servers = c.defaultdict(set), c.defaultdict(set)
files = set()
for line in f:
    parts = line.split(',')
    fi,site,server = [p.strip() for p in parts]
    files.add(fi)
    sites[fi].add(site)
    servers[fi].add(server)

for f in files:
    print "%s; %s; %s" % (f, ", ".join(sites[f]), ", ".join(servers[f]))

答案 1 :(得分:2)

您的数据结构取决于您的程序。也许你也可以存储 一个元组列表的文件名字典(sitename1, servname2)这里有很多方法可以完成你想要做的事情

您可以执行以下操作:

import csv

file_names_to_data = {}

with open('your_csv') as f:
   reader = csv.reader(f)
   for line_list in reader:
      try:      
        file_names_to_data[line_list[0]]['sitenames'].append(line_list[1])
        file_names_to_data[line_list[0]]['servernames'].append(line_list[2])
      except KeyError:
        # initialize it
        file_names_to_data[line_list[0]] = {'sitenames': [line_list[1]], 'servernames': [line_list[2]]}

另外,看起来defaultdict可能非常有用。

答案 2 :(得分:1)

使用字典文件名和2个每个字典项的网站名和服务器名列表

答案 3 :(得分:0)

正如它所发生的那样,这里包括了我的问题的解决方案。 exampleFile包括。

CODE:

fp = r'PATH_TO_FILE'

aliases = []
aliases.append(("sitex","sitez","sitey"))


splitFile = []
for l in open(fp):
    parts = tuple(l[:-1].replace(" ","").split(","))
    splitFile.append(parts)

def isAlias(old, new):
    print old, new
    aliasFound = False
    for alias in aliases:
        if old in alias and new in alias:
            aliasFound = True

    return aliasFound

handledSites = []
for split in splitFile:
    log = split[0]
    site = split[1]
    rp = split[2]


    matchFound = False
    for hs in handledSites:
        if site in hs[0]:
            matchFound = True
            if rp not in hs[1]:
                hs[1].append(rp)
            if log not in hs[2]:
                hs[2].append(log)
        if not matchFound:
            if isAlias(hs[0][0], site):
                matchFound = True
                hs[0].append(site)
                if rp not in hs[1]:
                    hs[1].append(rp)
                if log not in hs[2]:
                    hs[2].append(log)
    if not matchFound:
        handledSites.append(([site],[rp],[log]))

for s in handledSites:
    print s

示例文件

logfile[date]_[server]_sitex.log, sitex, rp1
logfile[date]_[server]_sitex.log, sitex, rp2
logfile[date]_[server]_sitey.log, sitey, rp1
logfile[date]_[server]_sitey.log, sitey, rp2
logfile[date]_[server]_sitez.log, sitez, rp1
logfile[date]_[server]_sitez.log, sitez, rp2
logfile[date]_[server]_site3.log, site3, rp1
logfile[date]_[server]_site3.log, site3, rp2