2017-10-13 105 views
0

有沒有辦法從最後一行(文件結束)只下載部分文件。就像文件超過40 MB一樣,我想只檢索最後一塊,比如說2042字節。有沒有可能通過ftplib使用python 3來做到這一點?使用ftplib下載部分文件

+0

不,據我所知,由於我們下載和接收數據包的方式,不可能這樣做。但是,您可以流式傳輸文件,然後只讀最後幾個塊。有關更多詳細信息,請參閱[本答案](https://stackoverflow.com/a/18773444/8381175)。 –

回答

3

嘗試使用FTP.retrbinary()方法並提供rest參數,它是所需文件的偏移量。由於偏移量是從文件的開頭開始的,因此需要使用文件大小和所需數據字節數來計算偏移量。下面是一個例子使用Debian的FTP服務器:

from ftplib import FTP 

hostname = 'ftp.debian.org' 
filename = 'README' 
num_bytes = 500    # how many bytes to retrieve from end of file 

ftp = FTP(hostname) 
ftp.login() 
ftp.cwd('debian') 

cmd = 'RETR {}'.format(filename) 
offset = max(ftp.size(filename) - num_bytes, 0) 
ftp.retrbinary(cmd, open(filename, 'wb').write, rest=offset) 

ftp.quit() 

這將檢索請求的文件末尾的最後num_bytes字節,並將其寫入到當前目錄下的同名文件。

retrbinary()的第二個參數是回調函數,在這種情況下,它是可寫入文件的write()方法。您可以編寫自己的回調來處理檢索到的數據。

+0

謝謝,這真的很有幫助 – Nastyjoe

1

只需使用retrbinaryrest參數告訴服務器應該開始傳輸數據的文件偏移量。從documentation

FTP.retrbinary(命令,回調[,maxblocksize [,休息]])
...其餘意味着同樣的事情在transfercmd()方法。

FTP.transfercmd(cmd [,rest])
...如果給出可選休息,則將REST命令發送到服務器,將rest作爲參數傳遞。休息通常是一個字節偏移到請求的文件,告訴服務器重新開始發送文件的字節在請求的偏移量,跳過最初的字節。