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

2024-05-29 03:11:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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脚本来提取文件-我的第一个版本的脚本非常简单-但是它可以工作

^{pr2}$

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

我必须能够访问原来存在的换行符,因为我的一些代码处理是基于行的。在


Tags: 文件theto命令服务器脚本getascii
3条回答

我看着这个,想知道为什么ftplib的创建者决定首先去掉新行字符。我在谷歌上搜索,没有找到一个令人满意的答案,所以我想去ftplib并修改代码-这对我来说比我的第一个答案更简单。于是我找到了ftplib.pyC:\Python27\Lib中的文件

我做了一份名为ftplib的拷贝_myMOD.py公司然后打开。找到了retrlines函数并对其进行了修改

    fp = conn.makefile('rb')
    while 1:
        line = fp.readline()
        if self.debugging > 2: print '*retr*', repr(line)
        if not line:
            break
        #if line[-2:] == CRLF:  Commented out
         #   line = line[:-2]   Commented out
        #elif line[-1:] == '\n': Commented out
          #  line = line[:-1]    commented out

保存文件,关闭空闲并重新启动它。完成此操作并导入后

^{pr2}$

我发现线路断了。在

我喜欢这种方法,因为它意味着我的步骤比使用lambda时少。不确定这是否是一个好的实践,但它是有趣的,看看功能,并从中学习一些东西。在

很喜欢PyNEwbie对lambda的使用,谢谢。这是同一代码的一个更通用的版本-尝试将此作为注释添加到您的帖子中,但它不接受代码:

from ftplib import FTP

def ftp_download_textfile(host, user, passwd, subdir, filename):
    ftp = FTP(host, user=user, passwd=passwd)
    ftp.cwd(subdir)
    fp = open(filename, 'w')
    ftp.retrlines('RETR ' + filename, lambda s, w = fp.write: w(s + '\n'))
    fp.close()

ftp_download_textfile('ftp.example.com', 'skywalker', 'maltesefalcon',
                      'spec/files', 'secretplans.csv')

就像通常我写问题的时候,我可以去寻找答案。我想删除这个问题,而不是回答它,但我想可能还有其他人像我一样可以使用这个答案,所以我将发表我从这篇文章中得到的东西。在

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

基本上,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()

相关问题 更多 >

    热门问题