2013-06-20 4 views
32

이것은 약간 이상한 요청이지만 파일을 작성한 다음 다른 시간에 다시 읽는 방법을 찾고 있습니다.Python 2.7 - 파일에서 목록 쓰기 및 읽기

목록을 다시 작성하여 아래 예제처럼 제대로 형성/형식이 지정되지는 않습니다. 당신이 사람이 읽을 수/편집 할 필요가없는 경우

test 
data 
here 
this 
is one 
group :) 

test 
data 
here 
this 
is another 
group :) 

답변

92

, 가장 쉬운 해결책은 단지 pickle을 사용하는 것입니다

내 목록은 다음과 같은 데이터를 가지고있다.

작성하려면

with open(the_filename, 'wb') as f: 
    pickle.dump(my_list, f) 

읽기 :

당신이 경우
with open(the_filename, 'rb') as f: 
    my_list = pickle.load(f) 

는 그들이 사람이 읽을 수 있어야합니다, 우리는 더 많은 정보를 필요로한다. my_list 만약

단지 그들에게 한 줄에 하나씩 쓰기, 아니 임베디드 줄 바꿈으로 문자열 목록으로 보장 : 그들은 유니 코드 문자열이 아닌 바이트 문자열을 경우

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write(s + '\n') 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip('\n') for line in f] 

, 당신은거야 encode이 필요합니다. (또는 바이트 문자열 일 경우 시스템 기본과 동일한 인코딩으로되어 있지 않아도됩니다.)

줄 바꿈 또는 인쇄 할 수없는 문자 등이있을 수있는 경우 이스케이프 또는 인용을 사용할 수 있습니다 . 파이썬에는 stdlib에 내장 된 여러 가지 다른 종류의 이스케이프가 있습니다.

의 한 번에 위의 두 가지 문제를 해결하기 위해 여기 unicode-escape를 사용하자 :

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write((s + u'\n').encode('unicode-escape')) 

with open(the_filename, 'r') as f: 
    my_list = [line.decode('unicode-escape').rstrip(u'\n') for line in f] 

당신은 또한 중 하나 codecs 모듈 또는 함께, 2.X에서 3.x의 스타일 솔루션을 사용할 수 있습니다 io 모듈 : *

import io 

with io.open(the_filename, 'w', encoding='unicode-escape') as f: 
    f.writelines(line + u'\n' for line in my_list) 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip(u'\n') for line in f] 

* TOOWTDI, 그래서 이는 하나의 확실한 방법이다? 그것은 다릅니다 ... 짧은 버전 : 2.6 이전의 Python 버전으로 작업해야하는 경우 codecs; 그렇지 않은 경우 io을 사용하십시오.

+0

나는 피클 라이브러리를 좋아하는데, 그것은 꽤 달콤하고 완벽하게 작동합니다.나는 이미 그것을 구현했고 그것은 잘 작동하는 것 같다. 고마워요, 당신을 녹색 눈금으로 표시해 드리겠습니다. – Ryflex

+0

유니 코드 - 이스케이프 ... TypeError 때문에 'wb'로 열어야했습니다. 바이트가 아닌 str이어야합니다. – rluks

+0

@ Pan.student : Python 3.x를 사용하고 있습니까? 이 질문에 대해 묻고있는 Python 2에서'str'과'bytes'는 같은 타입이고, 바이너리 파일과 텍스트 파일의 차이점은 개행 만의 번역입니다. 파이썬 3에서'str'과'unicode'는 같은 타입입니다. 바이너리 파일과 텍스트 파일의 차이는 텍스트 파일이 자동으로 인코딩되고 디코드된다는 것입니다. ('io.open'을 사용하는 3.x 스타일의 텍스트 파일을 포함하여 신중하다면 2.x의 경우 3.x와 비슷한 동작을 얻을 수 있지만, Asker는 그렇게하지 않았습니다.) – abarnert

12

만큼 파일이 일관된 형식 (즉, 행 구분)를 가지고,이 단지 기본 파일 IO 및 문자열 조작으로 쉽게 : 항목의 목록으로 데이터 파일을 저장합니다

with open('my_file.txt', 'rU') as in_file: 
    data = in_file.read().split('\n') 

, 한 줄에 하나씩. 파일에 넣으려면 다음과 같이하십시오 :

with open('new_file.txt', 'w') as out_file: 
    out_file.write('\n'.join(data)) # This will create a string with all of the items in data separated by new-line characters 

바라는대로 그 파일을 찾으십시오.

+0

+1. 우리가 말하는 '데이터'가 복잡하지 않다면 IMHO와 같이 자신의 파서를 굴리는 것이 더 좋습니다. – brokenfoot