2016-05-19 12 views
1

Ich schreibe eine Programmdatei von einem FTP-Server zum Download, hier ist der Code:Gesamt Bytes erhalten durch Socket ist anders mit realer Dateigröße

from ftplib import FTP 

host = 'x.x.x.x' 
user = 'demo' 
password = 'fakepw`' 
path = '/mnt10/DATA/201605/' 
filename = 'DATA.TXT' 
ftp = FTP(host, user, password) # connect to host, default port 
ftp.cwd(path) 
ftp.voidcmd('TYPE I') 
sock = ftp.transfercmd('RETR ' + filename) 
f = open('D:\\DATA\\' + filename, 'wb') 
chunk = 1 
while True: 
    block = sock.recv(1024*1024) 
    if not block: 
     break 
    print('Getting file {} bytes'.format(chunk*(1024**2))) 
    chunk += 1 
    f.write(block) 
sock.close() 

Hier ist das Ergebnis des laufenden Programms:

Getting file 1048576 bytes 
Getting file 2097152 bytes 
Getting file 3145728 bytes 
Getting file 4194304 bytes 
Getting file 5242880 bytes 
.......................... 
Getting file 22020096 bytes 
Getting file 23068672 bytes 
Getting file 24117248 bytes 
Getting file 25165824 bytes 
Getting file 26214400 bytes 

Process finished with exit code 0 

Aber die eigentliche Dateigröße nur um 11,5 MB Real file size

ich weiß nicht, warum sie anders sind.

Edit: Als @ Martin Prikryl Antwort, habe ich mein Programm wie folgt ändern:

total_size = 0 

while True: 
    block = sock.recv(1024*1024) 
    if not block: 
     break 
    print('Size of block: {}'.format(len(block))) 
    total_size += len(block) 
    f.write(block) 

print('Total size: {}'.format(total_size)) 

sock.close() 

Und jetzt das Programm gut läuft.

Size of block: 1048576 
Size of block: 6924 
Size of block: 1048576 
...................... 
Size of block: 14924 
Size of block: 771276 
Total size: 11523750 

Process finished with exit code 0 
+2

Wenn Sie eine 'recv()' von '1024x1024' Bytes machen, erhalten Sie nicht unbedingt den vollen Betrag, den Sie verlangt haben. –

Antwort

2

Wenn der Socket asynchron ist, bekommt man nicht ganze 1024*1024 Bytes. Sie erhalten nur so viele Bytes wie verfügbar (wurde bereits empfangen).

Drucken Sie stattdessen die Größe block, um eine genaue Anzahl gelesener Bytes zu erhalten.

+1

Ich habe mein Programm bearbeitet und jetzt funktioniert es wie ich es wünsche. Vielen Dank. –