2011-04-13 6 views
3

파이썬을 사용하여 일부 파일을 암호화하고 있지만 청크로 파일 청크를 읽는 데 문제가 있습니다.파일 청크를 청크로 읽을 때 파이썬이 모든 데이터를 반환하지 않음

마지막 청크의 모든 데이터를 반환하지 않는 경우가 있습니다.

파일 길이가 307200 바이트인데 문제가 없습니다. 길이가 279363 바이트 일 때 그렇습니다.

나는 (큰 각각 307,200 & 279,363 바이트)이 개 파일

chunksize = 65536 
w = open(filename + '.' + str(cs) + '.split', 'wb') 
tdata = f.read(307200) 
w.write(tdata) 
w.close 

infile.open(filename + '.' + str(cs) + '.split', 'rb') 

while True: 
    chunk = infile.read(chunksize) 
    print "Chunk length: " + str(len(chunk)) 
    if len(chunk) == 0: 
     break 
    elif len(chunk) % 16 != 0: 
     chunk += ' ' * (16 - len(chunk) % 16) 

이상이 코드 조각을 실행 그리고 난이 있어요 : 당신이 볼 수 있듯이, 모든의 합을

 
File 1 (307200): 
Chunk length: 65536 
Chunk length: 65536 
Chunk length: 65536 
Chunk length: 65536 
Chunk length: 45056 
Chunk length: 0 

File 2 (279363): 
Chunk length: 65536 
Chunk length: 65536 
Chunk length: 65536 
Chunk length: 65536 
Chunk length: 16384 
Chunk length: 0 

을 첫 번째 파일의 청크 크기가 정확하면 두 번째 파일의 합이 NOT입니다. 왜 그런지 모르겠습니다.

내 파이썬 버전 (우분투 10.04.2 LTS에서 실행) 2.6.5
입니다

* 편집 : 내 자신의 바보 같은 잘못. 방금 쓴 파일을 읽기 전에 w.close() 대신 w.close을 사용했는데 문제가 발생했습니다.

+1

입력 파일 자체를 고려 했습니까? 어떤 종류의 내용, 인코딩 등 – krs1

+0

+1 매우 흥미 롭습니다! – rubik

+0

암호화 코드를 제거하면 작동합니까? 말하자면, 코드를 복사하는 것이 전부라면 코드가 작동합니까? – Nate

답변

4

Windows에서 실행 중이십니까? 그렇다면 open your files in binary mode을 입력해야합니다.

infile = open('somefile','rb') 
+0

미안합니다. 그 정보. 그것은 리눅스에 있고, 나는 이미 rb 모드로 열었습니다. 더 많은 정보를 추가하겠습니다. – skerit

+0

그것은 나에게 도움이되었다! 감사! – Jack

0

그건 이상합니다.

는 이름이 '이름'의 파일에서, 첫 번째와 두 번째 파일을 만들고 279363307200를 교체 했습니까? '.split'

: 그런데

, 그것은 파일의 이름에 대한 이상한 확장입니다. 또한

from os.path import getsize 

chunksize = 65536 

for x in xrange(279363,307201): 
    w = open(filename + '.' + str(cs) + '.split', 'wb') 
    tdata = f.read(x) 
    w.write(tdata) 
    w.close 

    siz = getsize(filename + '.' + str(cs) + '.split') 
    if siz!=x: 
     print 'file has not the right size' 
     print 'x=='+str(x)+' size of created file : '+str(siz) 

    infile.open(filename + '.' + str(cs) + '.split', 'rb') 

    li = [] 
    while True: 
     chunk = infile.read(chunksize) 
     li.append(str(len(chunk))) 
     if len(chunk) == 0: 
      break 

    if sum(li)==x: 
     print 'good at '+str(x) 
     break 

시도

from os import fsync 

chunksize = 65536 
w = open(filename + '.' + str(cs) + '.split', 'wb') 
tdata = f.read(307200) 
w.write(tdata) 
w.flush() 
fsync(w.fileno()) 
w.close 
1

내가 지금 아주 바보가 된 기분,하지만 난 아무도 다른 사람 같은 문제를 발견하지 가지 다행이야 :

나는이 코드를 실행하도록 제안한다.

w.close()가 아닌 w.close를 호출했습니다.

관련 문제