我有一个包含以下结构的大型csv文件(几百行):
filename,sitename,servername
这个csv文件包含几个双打,因为服务器名是来自群集的(总是相同的夫妻)和网站名的语言别名(例如,mijnhuis,myhouse,mamaison)
我希望得到的结果如下(注意;和,: 文件名; sitename1,sitename2,sitename3; servername1,servername2,servername3;
我怎样才能以最优化的方式做到这一点?
PS:实际代码会很好,但是如果你能给我指示,我会同样高兴。
答案 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