多年来,我一直在使用一个非常简单的批处理文件从 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()
