2014-03-12 3 views
0

바이너리 형식 (npy 또는 npz, 바람직하게)으로 데이터를 행 단위로 저장하려고합니다. 특히, 내가 뭘하고 싶은 것입니다 :파이썬에서 행별로 파일에 바이너리 데이터 저장

  1. 열기/
  2. 데이터
  3. 저장 행의 행을 생성합니다 (사전으로) 파일에
  4. 저장 헤더 정보 바이너리 형식 파일을 생성 데이터의 ...
  5. 데이터
  6. 저장 데이터 파일 의 행의 새 행을 생성 파일로 모든 행에 대해 반복
,

가장 최근에 시도한 내용은 savez입니다. 이렇게하면 이전 행의 데이터를 덮어 씁니다. 나는 에 데이터를 덧붙여에 덧붙이고 싶습니다. 그러나 덮어 쓰지 않습니다. 코드에 대한 기본적인 아이디어는 다음과 같습니다 :

header = {'TIME': 20, 'POSITION': 30} 
    testfile = open('test.npz', 'wb') 
    np.savez(testfile, header) 
    testfile.close() 

    i = 0 
    while i < 5: 
     data = [i]*100 # generate row of data 
     testfile = open('test.npz', 'wb') 
     np.savez(testfile, data) #append data to current file 
     testfile.close() 
     i += 1 

내가 생성하고 데이터 세트가 매우 큰, 그러므로 나는 메모리의 전체 세트를 저장하고 마지막에 저장할 수 없습니다.

답변

0

플래그가 'wb' 인 파일을 열면이 파일을 덮어 쓰고 이진 파일이라는 의미입니다. 추가/이진에 플래그 'ab'을 사용하려고합니다.

또한 열기/닫기 패턴이 필요하지 않습니다. 파일을 열어 놓고 변경 사항을 디스크에 수시로 플러시하여 부분적인 진행 상황을 기록 할 수 있습니다. , 당연히

with open('test.npz', 'wb') as testfile: 
    header = {'TIME': 20, 'POSITION': 30} 
    np.save(testfile, header) 
    i = 0 
    while i < 5: 
     data = [i]*100 # generate row of data 
     np.save(testfile, data) #append data to current file 
     i += 1 

당신이 파일에 추가 할 새 데이터가있는 경우 'ab''wb'을 변경할 수 있지만, 당신은 아마 추가로 헤더 정보의 기록을 분할 할 : 나는과 같이 전체 코드를 래핑 것 로직을 두 개의 분리 된 함수 (즉, 파일을 만들고 헤더를 작성하는 create_new)와 파일을 'ab' 모드로 열고 저장하려는 데이터를 추가하는 save_data을 분리하십시오.

+0

내가 제안한대로 데이터 파일을 열려고하면 오류가 발생합니다. 이전에는'arrays = np.load ('test.npz')','print arrays.files'를 사용하여 저장된 배열을 출력했습니다. 이제 오류가 발생합니다 :'zipfile.BadZipfile : 중앙 디렉토리의 잘못된 매직 번호 ' – user3403779

+0

그러나, 당신의 방법을 사용하지만 .npy 형식과 np.save()를 사용하여 작동합니다. 처음에는 저장된 하나의 배열 (헤더)이있는 것 같지만 루프를 사용하여 모든 배열에 액세스 할 수 있습니다. 예 :'fp = open ('test.npy', 'rb')','for i (range) : print np.load (fp)'. – user3403779

+0

'numpy.save'를 사용하면 압축을 포함하는 복잡성을 다루지 않아도됩니다. – metatoaster

관련 문제