2012-06-12 3 views
1

배열을 파일에 저장하는 방법을 알고 싶습니다. 당신은 이미 나에게 많은 도움이,하지만 난 (파이썬에 새로 온) 더 순진한 질문 :배열을 파일에 저장하는 방법

@<TRIPOS>MOLECULE 
NAME123 
line3 
line4 
line5 
line6 
@<TRIPOS>MOLECULE 
NAME434543 
line3 
line4 
line5 
@<TRIPOS>MOLECULE 
NAME343566 
line3 
line4 

나는 현재 나는이 코드를 가지고 있지만,이 배열에서 단지 마지막 항목을 저장의 아니오 없다 모두는 items_grep에 나열되어 있습니다. 이 문제를 해결하는 방법?

items = [] 
with open("test.txt", mode="r") as itemfile: 
    for line in itemfile: 
     if line.startswith("@<TRIPOS>MOLECULE"): 
      items.append([]) 
      items[-1].append(line) 
     else: 
      items[-1].append(line)  
# 
# list to grep 
items_grep = open("list.txt", mode="r").readlines() 
# writing files 
for i in items: 
    if i[1] in items_grep: 
     open("grep.txt", mode="w").write("".join(i)) 

감사합니다.

답변

1

파일이 마지막 값만 표시하는 이유는 w 플래그로 파일을 열 때마다 기존 파일이 지워지기 때문입니다. 한 번 열어서 파일 객체를 사용하면 잘 될 것이므로, 그렇게 할 것입니다. (참고로,이 작업은 매우 깨끗하고 파이썬적인 방식이 아니며 열린 명령이 어떻게 작동하는지 명확히 알 수 있습니다)

이 처리하는
myfile = open("grep.txt", "w") 
for i in ... 
    if i[1] ...: 
     myfile.write(i + '\n') 

쉬운 방법은, 예를 먼저 목록 이해를하고 그 다음에 가입하는 것입니다 :

newstr = '\n'.join([''.join(i) for i in items if i[1] in items_grep]) 

가 그럼 그냥 한 번에 파일의 전체 문자열을 작성합니다. 항목간에 \n을 추가하지 않으면 새 행의 각 항목이 끝나지 않고 공백없이 차례대로 추가됩니다.

파일을 자동 닫으려면 with 키워드를 사용하는 것도 좋습니다.

with open("grep.txt","w") as f: 
    f.write(newstr) 
+0

감사합니다. 문제는 ** join **입니다. 자세한 내용을 설명해주십시오. 왜 마지막 만? –

+0

질문에 대한 답변을 추가했습니다. for 루프를 반복 할 때마다 파일을 다시 엽니 다. (매번 지울 때마다) –

+1

@JohnAmraph 따라서 '\ n'.join()'이 문제를 해결 한 이유는 모든 파일 쓰기를 결합했기 때문입니다 하나의 성명서로 (그래서 그들 중 누구도 서로 겹쳐서 : P) –

관련 문제