Skip to main content
 首页 » 编程设计

python之如何使用 ftplib 正确下载文件以便为 Windows 添加换行符

2025年05月04日15mq0036

多年来,我一直在使用一个非常简单的批处理文件从 UNIX ftp 服务器下载数百万个文件

login 
passwd 
ascii 
prompt n 
cd to the right directory 
get some_file 
get another_file 
cd to the next directory 
repeat the pattern 

这样做的好处是它很简单,所有文件都带有 Window 的换行符,因此这些文件可以与我现有的程序一起使用。由于我的路由器发生了一些变化,我不得不编写一个 Python 脚本来提取文件 - 我的第一个脚本版本非常简单 - 但它有效

for key in key_filings: 
   for filing in key_filings[key]: 
        remote_directory = '/foo/bar/' + key + '/' + filing['key_number'] 
        ftp.cwd(remote_directory) 
        text_file = filing['txt'] 
        ftp.retrlines('RETR '+ text_file, open(save_dir + text_file,'w').writelines) 
        hdr_file = filing['hdr'] 
        ftp.retrlines('RETR ' + hdr_file, open(save_dir + hdr_file,'w').writelines) 

但是,这些文件没有任何明显的换行符。这些文件存储在 unix 系统中。在我使用 Windows CMD shell 下载文件之前,换行符就在那里。我尝试发送 ASCII 命令,但正如预期的那样没有任何效果。

我能够访问最初存在的换行符至关重要,因为我的一些代码处理是基于行的。

请您参考如下方法:

正如通常发生的那样,当我写出一个问题时,我可以去寻找答案。我想删除问题而不是回答问题,但我认为可能有像我这样的其他人可以使用答案,所以我将发布我从这个 webpage 中得到的东西弗雷德里克·伦德 (Fredrik Lundh) 着。

我想保存文件而不是像在该脚本中那样将其打印到屏幕上

基本上,retrlines 一次从服务器检索一行(在下面的脚本中,我正在编写该行,因为它添加了一个换行符。

我不太了解 lamda 函数或回调是什么,所以这是我最终理解这些概念的借口。

import ftplib 
ftp = ftplib.FTP('ftp.some.site', user = 'username', passwd = 'password_for_username') 
 
for key in key_filings: 
    for filing in key_filings[key]: 
        remote_directory = '/foo/bar/' + key + '/' + filing['key_number'] 
        ftp.cwd(remote_directory) 
        text_file = filing['txt'] 
        save_text_ref = open(save_dir + text_file, 'w') 
        ftp.retrlines('RETR '+ text_file, lambda s, w = save_text_ref.write: w(s+'\n')) 
        save_text_ref.close() 
        hdr_file = filing['hdr'] 
        save_hdr_ref = open(save_dir +hdr_file,'w') 
        ftp.retrlines('RETR ' + hdr_file, lambda s, w = save_hdr_ref.write: w(s+'\n')) 
        save_hdr_ref.close()