: 시나리오
가 A (parsed_pvlog) B (pdetail) 두 파일
A.uuid == B.uuid, 하나 개의 필드 (cpssrc)에서 파일 A가 파일 B를 추가 할 때
방법 :
AB 전체 행은 파일 필드를 읽어 값으로 사전에. 두 중첩 된 DICT. {UU 값 : 스위치 딕셔너리}} {선
은 A의 횡단 KV, db.get (K)의 경우, DB [K] [ 'cpssrc'] = v.get ( 'cpssrc' '')
AB로 각 메모리 비교적 다수 딕셔너리, 마지막 KV에게 이송
방법 2 :
하는 사전 KVS = parse_logstr_to_dict (선) 인 파일의 각 행을 변환하는 경우 키로 UUID kvs.get ( 'cpssrc' '')의 값 userCps 같이 사전에 값 cpssrc 값
userCps에서 키를 획득 UUID UUID 얻어지는 값에 대응하는 사전 KVS = parse_logstr_to_dict (라인)에 파일 B의 각 라인을 통과는 UUID 값 결합은 원본 파일 B cpssrc 배치 사전 KVS의 각 행
의 메모리 만하므로 사전 파일 B 직접 액세스 파일 ( 'cpssrc 값'의 UUID 값) userCps, 각 라인은 전류 변환 딕셔너리을 첨가하여
#coding=utf-8
import os
import sys
from datetime import datetime, timedelta
reload(sys)
sys.setdefaultencoding('utf8')
#解析日志为字典,输入k1=v1 \t k2=v2 \t k3=v3 \t ...
def parse_logstr_to_dict(logstr,rdsp = '\t'):
log_dict = {}
kvs = logstr.strip('\n').split(rdsp)
for kv in kvs:
pos = kv.find('=')
if pos < 0 : continue
k = kv[0:pos]
v = kv[pos+1:]
log_dict[k] = v
return log_dict
#将字典转为list
def trans_dict_2_logstr( log_dict, rdsp='\t' ):
result = []
for k in log_dict:
result.append( '%s=%s' % (k, log_dict[k]) )
return rdsp.join( result )
def add_cpssrc_to_pdetail(log1,log2,outFile):
f = open(outFile, "w")
for line2 in open(log2): #遍历b文件的每一行
for line1 in open(log1):#遍历a文件的每一行
line1Dict=parse_logstr_to_dict(line1)
if(line2.find(line1Dict['uu'])>=0):
line2=line2.strip("\n")+"\t"+"cpssrc="+line1Dict['cpssrc']+"\n"
f.writelines(line2)
continue
f.close()
# add_cpssrc_to_pdetail("c://parsed_pvlog.log","c://pdetail.log","c://hello.log")
# 方法一
def load(log1,log2,outFile):
f = open(outFile, "w")
f1=open(log1)
f2=open(log2)
da={}
db={}
for s in f1: #加载A//uu为k,一行全字段字典作为值。两层dict嵌套。{uu的值:{一行转为dict}},大dict中嵌套小dict
myd=parse_logstr_to_dict(s)
da[myd['uu']]=myd
for s in f2: #加载B//uu为k,值一行全字段字典
myd = parse_logstr_to_dict(s)
db[myd['uu']] = myd
print 44
for k, v in da.items():
if db.get(k):
db[k]['cpssrc']=v.get('cpssrc','')#['cpssrc']
for k,v in db.items():
f.write(trans_dict_2_logstr(v)+"\r\n")
f.close()
load("c://parsed_pvlog.log", "c://pdetail.log", "c://hello4.log")
# 方法二
#uuid-->cpssrc
pvlog="c://parsed_pvlog.log"
oldPdetailLog="c://pdetail.log"
newPdetailLog="c://my.log"
fw = open(newPdetailLog, "w")
userCps={}
f=open(pvlog)
for line in f:
kvs=parse_logstr_to_dict(line)
if kvs.get('cpssrc',''):
userCps[kvs.get('uu')]=kvs.get('cpssrc')
f.close()
f=open(oldPdetailLog)
for line in f:
kvs=parse_logstr_to_dict(line)
uuid=kvs.get('uu','')
kvs['cpssrc']=userCps.get(uuid,'')
fw.write(trans_dict_2_logstr(kvs))
fw.write('\r\n')
fw.close()
f.close()