通过套接字接收的总字节数与实际文件大小不同
Total bytes receive through socket is different with real file size
我写了一个从FTP服务器下载文件的程序,代码如下:
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()
这是 运行 程序的结果:
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
但实际文件大小只有11.5MB左右
不知道为什么不一样
编辑:
作为@Martin Prikryl 的回答,我已经像这样改变了我的程序:
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()
现在程序运行很好。
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
如果套接字是异步的,您不会获得整个 1024*1024
字节。您只能获得可用的字节数(已收到)。
改为打印 block
的大小,以获得准确的读取字节数。
我写了一个从FTP服务器下载文件的程序,代码如下:
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()
这是 运行 程序的结果:
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
但实际文件大小只有11.5MB左右
不知道为什么不一样
编辑: 作为@Martin Prikryl 的回答,我已经像这样改变了我的程序:
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()
现在程序运行很好。
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
如果套接字是异步的,您不会获得整个 1024*1024
字节。您只能获得可用的字节数(已收到)。
改为打印 block
的大小,以获得准确的读取字节数。