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
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
Wenn Sie eine 'recv()' von '1024x1024' Bytes machen, erhalten Sie nicht unbedingt den vollen Betrag, den Sie verlangt haben. –