2012-07-17 2 views
1

두 개의 XML 파일의 정보를 두 개의 사전으로 추출했습니다. 두 파일을 비교하고 그 중 하나에서 정보를 변경하려고했기 때문입니다.파이썬 사전의 값을 파일로 다시 보냅니다.

소스 사전 :

d_source={'123': 'description_1', '456': 'description_2'} 

대상 사전 :

for i in d_source: 
    for j in d_target: 
     if d_target[j]=='\n': 
      d_target[j]=d_source[i] 
print (d_target) 

d_target가 업데이트됩니다 : 이것은 내 대체 코드가

d_target={'123': '\n', '456': 'description_2'} 

입니다

내 사전입니다

d_target = {'123': 'description_1', '456': 'description_2'} 

그러나 사전을 추출한 원본 파일은 변경되지 않습니다. 내가 여기서 무엇을 놓치고 있니? 당신이 될 것를위한 솔루션

+4

사전을 수정하는 경우 어떻게 파이썬 코드가 파일을 수정하기를 기대합니까? – Blender

+0

그게 내가 묻는 이유입니다. 저는 파이썬을 처음 접했습니다. 사전을 내 파일로 다시 가져올 수 있다고 생각했지만 어떻게해야할지 모릅니다. – Kaly

+2

사전을 파일에 다시 써야하며 사전과 파일 간에는 링크가 없습니다. –

답변

2

하나 : 당신이 이미 dicts을 사용하는 경우

의 당신이 JSON로 인쇄 할 가정 해 봅시다, 그것은 의미가 있습니다.

import json 
output = json.dumps(d_target) 

f = open("myfile", 'w') 
f.write(output) 
f.close() 

이렇게하면 myfile 파일을 json으로 인쇄합니다.

그리고 XML로 원하면 elementtree 모듈을 사용할 수 있습니다. 이 그것을 수행하는 방법을보고 그냥 예입니다

from elementtree import ElementTree as ETree 
ET = ETree 
ET.xml_declaration = "true" 
products = ET.Element("products") 
properties = ET.Element("properties") 
products.append(properties) 
products.attrib["xmlns"] = "http://schema.example.com/product_data_1.0" 
update = ET.Element("update") 
delete = ET.Element("delete") 
products.append(delete) 
products.append(update) 

이 같은 것을 만들 것입니다 :

그런 다음이 같은 것을 사용할 수

<products xmlns="http://schema.example.com/product_data_1.0"> 
     <properties /> 
     <delete /> 
     <update /> 
</products> 

를 그리고이 XML을 인쇄 파일 다시 :

output = ET.tostring(products, "utf-8") 
f = open("xml", 'w') 
f.write(output) 
f.close() 
+0

JSON은 간단합니다. 일대일 매핑이 없으므로 XML은 일반적으로 조금 어렵습니다. 그러나 일반적으로 접근법은 정확합니다. 비 직렬화, 변경, 직렬화. – Krumelur

+0

좋은 아이디어! 하지만 불행히도 XML 출력이 필요합니다. 그렇지 않으면 파일을 내 소프트웨어로 다시 가져올 수 없습니다. /. – Kaly

0

대체 코드 (예 :)는로 바꿀 수 있습니다. dict에있는 방법은입니다.

d_target.update(d_source) 

나는 당신이 dict을 유지하려는하지만 json 모듈을 사용하면 하나의 옵션이 얼마나 확실하지 않다. 그렇지 않으면 업데이트 된 XML 파일을 원한다면 노드의 속성을 수정하고 "somelibraryhere".tostring() (또는 유사한) 메소드의 결과를 작성해야합니다.

관련 문제