2014-09-01 3 views
-1

나는 두 개의 파일 (dict)을 비교하고 value와 두 번째 dict에서 key1key2의 가치를 발견하고 세 번째 파일로 key value를 작성해야합니다. 파일을 읽고 쓸 수 있습니다. 나는 keyvalue 비교 프로세스가 붙어있다. 파일에는 두 개 이상의 열이 있지만 col [0] 및 col [1]에만 관심이 있습니다. DICT 조작

file 1: Key1 and key2 are part of key 

Key1 Key2 
0   1 
2   4 
3   1 
4   0 

file 2: 

    value key 
    3416 0 
    4562 1 
    3566 2 
    7843 3 
    2341 4 

나는 key1key2이 (가 확실히 존재) 파일 2에서 Key에있는 경우 확인하고 해당 value as value1 value2 in col[0] col[1]를 인쇄 할 수 있습니다.

from collections import defaultdict 

d1 = {} 
d2 = {} 

with open('file1.txt', 'r') as file1: 
    for row in file1: 
      cols = row.split() 
      key1 = cols[0] 
      key2 = cols[1] 
      #print key1, key2 

with open('file2.txt', 'r') as file2: 
    for row in file2: 
      cols = row.split() 
      value = cols[0] 
      #print value 

for key in d1, value in d2: 
    d1[key1] = d2[value] 
    d1[key2] = d2[value] 
    print d1[key1], d1[key2] 



Error: 
     KTraceback (most recent call last): 
     File "file_merge.py", line 20, in <module> 
     d1[key1] = d2[value] 
    KeyError: '3545' 

    3545 is one of the value in file 2 
+0

수 당신은 완전한 오류를 추가합니까? – Kasramvd

+0

'd2 '는 어떻게 채워 집니까? 'file2.txt'의'key'는'file1.txt'의'key1'과'key2'와 어떤 관련이 있습니까? 즉,'key1 == "abc"'와'key2 == "def"'이면,'key'의 값은 무엇입니까? –

+0

키와 값에 대한 세부 정보가 포함되어 있습니다. –

답변

2

당신은 d2에 데이터를 삽입하지 않습니다. 나는 이렇게해야 가정 : 데이터에

d2 = {} 

with open('file2.txt', 'r') as file2: 
    for row in file2: 
     cols = row.strip().split() 
     d2[cols[1]] = cols[0] 

with open('file1.txt', 'r') as file1: 
    for row in file1: 
     cols = row.strip().split() 
     print ("%s\t%s" % (d2[cols[0]], d2[cols[1]])) 

이 제공 :

3416 4562 
3566 2341 
7843 4562 
2341 3416 
+0

'첫 번째 키만 사용하지만 값은 사용하지 않습니다. –

+0

@SitzBlogz ' 귀하의 초기 의도를 알지 못하지만 코드에서 불분명합니다. 귀하의 질문에 file2.txt에 두 개의 열만 있습니다. 실제 데이터를 지원할 수 있도록 코드를 올바르게 수정해야합니다. –

+0

나는 설명했다 : 하나의 파일은 처음 2 컬럼에 키를 가지고 있고 파일 2는 하나의 칼럼 col [0]을 값으로 가지고 col [1]을 키로 갖는다 (file1과 동일하다). key1과 key2의 해당 값이 인쇄됩니다. –

1
def yield_key_from_file1(): 
    with open("file1.txt") as fp: 
     for line in fp: 
      k1, k2 = line.split() 
      yield k1.strip() 
      yield k2.strip() 

def get_dict_from_file2(): 
    data = {} 
    with open("file2.txt") as fp: 
     for line in fp: 
      value, key = line.split() 
      data[key.strip()] = value.strip() 
    return data 

def write_dict_to_file3(data): 
    with open("file3.txt", 'w') as fp: 
     for key, value in data.iteritems(): 
      line = "{0} {1}\n".format(key, value) 
      fp.write(line) 

def main(): 
    keys = set(yield_key_from_file1()) 
    print("f1_keys", keys) 
    f2_dict = get_dict_from_file2() 
    print("f2_dict", f2_dict) 
    f3_dict = dict(
     (key, f2_dict[key]) for key in keys if key in f2_dict 
    ) 
    print("f3_dict", f3_dict) 
    write_dict_to_file3(f3_dict) 

if __name__ == '__main__': 
    main() 
+0

'역 추적 (가장 최근 통화 마지막) = 세트 (yield_key_from_file1()) 주요 키에 주() 파일 "m_f.py"에 파일 "m_f.py", 라인 36, 25 행,k1, k2 = line.split() ValueError : 언팩 할 값이 너무 많습니다. ' –

1

나는 확실하지 않다 당신이 뭔가를 찾고 있다면. 귀하의 질문은

listofkey1 = [] 
listofkey2 = [] 
mydict = {} 

with open('file1.txt', 'r') as file1: 
    for row in file1: 
      cols = row.split() 
      listofkey1.append(cols[0]) 
      listofkey2.append(cols[1]) 


with open('file2.txt', 'r') as file2: 
    for row in file2: 
      cols = row.split() 
      mydict[(cols[1])] = cols[0] 
      #print mydict 

for key1, key2 in zip(listofkey1, listofkey2): 
    print mydict[key1], mydict[key2] 

당신은 위의 코드에서이 출력을 얻을 .. 나에게 완전히 명확하지 않다 :

3416 4562 
3566 2341 
7843 4562 
2341 3416 

위의 당신은 File2.txt에 키 1과 키 2의 값을 해당됩니다

+0

'Traceback (최근 호출 마지막) : 파일 "m_f.py", 줄 21, 인쇄 mydict [key1], mydict [key2] KeyError : '384'384는 file1의 첫 번째 키입니다. 또한 file2에 키로 표시됩니다. –

+0

출력 결과가 정확하지만 오류가 발생합니다. –

+0

예외가 있습니까? – bluefoggy