当前位置: 首页 > 面试题库 >

是否可以在不使用Python编写文件的情况下读取FTP文件?

方宏富
2023-03-14
问题内容

我正在尝试使用Python的ftplib读取文件而不编写它们。大致相当于:

def get_page(url):
    try:
        return urllib.urlopen(url).read()
    except:
        return ""

但使用FTP。

我试过了:

def get_page(path):
    try:
        ftp = FTP('ftp.site.com', 'anonymous', 'passwd')
        return ftp.retrbinary('RETR '+path, open('page').read())
    except:
        return ''

但这不起作用。文档中的唯一示例涉及使用该ftp.retrbinary('RETR README', open('README', 'wb').write)格式编写文件。是否可以在不先写入的情况下读取ftp文件?


问题答案:

好吧,您的答案就在眼前:retrbinary方法接受对函数的引用作为第二个参数,该函数在从ftp连接中检索文件内容时被调用。

这是一个简单的示例

#!/usr/bin/env python
from ftplib import FTP

def writeFunc(s):
  print "Read: " + s

ftp = FTP('ftp.kernel.org') 
ftp.login()
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', writeFunc)

您应该实现writeFunc,以便它实际上将读取的数据附加到内部变量(类似这样),该内部变量使用可调用对象:

#!/usr/bin/env python
from ftplib import FTP

class Reader:
  def __init__(self):
    self.data = ""
  def __call__(self,s):
     self.data += s

ftp = FTP('ftp.kernel.org') 
ftp.login()
r = Reader()
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r)

print r.data

更新: 我意识到Python标准库中有一个用于此类事情的模块StringIO:

#!/usr/bin/env python
from ftplib import FTP
from io import StringIO

ftp = FTP('ftp.kernel.org') 
ftp.login()
r = StringIO()
ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r.write)

print r.getvalue()

更新2: StringIO已转入io。结合@TimRichardson的评论。:



 类似资料:
  • 问题内容: 有一个Java文件,其中包含一些依赖项jar。但是现在,我没有那些jars,必须将其编译为.class文件。 是否有可能做到这一点? 更新 感谢您的回答。 起初,我认为我们可以为缺少的依赖项创建一些存根,这很简单但是很无聊。既然我们可以创建存根而不会丢失存根以使编译器满意,那么为什么我们不能使工具自动完成呢?该工具不需要创建存根,而是读取java文件,收集信息,然后构建.class文件

  • 问题内容: 我处理非常大的二进制文件(每个文件从几个GB到多个TB)。这些文件以旧格式存在,并且升级需要将标头写入文件的FRONT。我可以创建一个新文件并重写数据,但是有时这可能需要很长时间。我想知道是否有更快的方法来完成此升级。该平台仅限于Linux,我愿意使用低级功能(ASM,C,C ++)/文件系统技巧来实现这一目标。基本库是Java,JNI是完全可以接受的。 问题答案: 没有本机执行此操作

  • 这不是一个浏览器。 我打算为我的机器人做一个“黑名单”数组,这将阻止用户运行命令。然而,我似乎只能在实际的bot文件上这样做,因为我还没有找到一种方法来做一个外部方法。 这就是我正在使用的:

  • 可以使用以下命令更新JAR文件中的单个文件: 有没有办法以编程方式做到这一点? 如果我使用,我必须重写整个jar文件,所以我想知道是否有类似的“随机访问”方式来做到这一点。鉴于它可以使用工具来完成,我曾期望有一种类似的编程方式来完成它。

  • 问题内容: 这是场景: ThreadA将要从某些套接字读取,并将数据写入“ MyFile.txt” ThreadB将读取“ MyFile”,到达末尾时,它将循环播放,直到MyFile中有新数据可用为止(因为我不想重新打开“ MyFile.txt”,并且浪费时间,所以我到达了从我所在的位置..)。 可以做这样的事情吗? 如果没有,还有其他方法可以做这种事情吗? 问题答案: 您提到的问题是著名的生产者

  • 我需要从我的中生成一个文件,但我希望避免创建。有可能吗?