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

从FTP python读取缓冲区中的文件

师谦
2023-03-14
问题内容

我正在尝试从FTP服务器读取文件。该文件是一个.gz文件。我想知道在套接字打开的情况下是否可以对此文件执行操作。我试图按照什么分两个问题,提到的阅读文件,而不写入磁盘和读取从FTP文件,而无需下载,但没有成功。

我知道如何提取下载文件上的数据/工作,但不确定是否可以即时执行。有没有一种方法可以连接到站点,在缓冲区中获取数据,还可以提取某些数据并退出?

尝试StringIO时出现错误:

>>> from ftplib import FTP
>>> from StringIO import StringIO
>>> ftp = FTP('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/PMC-ids.csv.gz')

Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
ftp = FTP('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/PMC-ids.csv.gz')
File "C:\Python27\lib\ftplib.py", line 117, in __init__
self.connect(host)
File "C:\Python27\lib\ftplib.py", line 132, in connect
self.sock = socket.create_connection((self.host, self.port), self.timeout)
File "C:\Python27\lib\socket.py", line 553, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
gaierror: [Errno 11004] getaddrinfo failed

我只需要知道如何将数据放入某个变量并在其上循环,直到读取FTP中的文件即可。

感谢您的宝贵时间和帮助。谢谢!


问题答案:

确保首先登录ftp服务器。之后,使用retrbinary以二进制模式提取文件。它在文件的每个块上使用回调。您可以使用它来将其加载到字符串中。

from ftplib import FTP
ftp = FTP('ftp.ncbi.nlm.nih.gov')
ftp.login() # Username: anonymous password: anonymous@

# Setup a cheap way to catch the data (could use StringIO too)
data = []
def handle_binary(more_data):
    data.append(more_data)

resp = ftp.retrbinary("RETR pub/pmc/PMC-ids.csv.gz", callback=handle_binary)
data = "".join(data)

优点:如何在使用字符串时解压缩字符串?

简易模式,使用上面的数据字符串

import gzip
import StringIO
zippy = gzip.GzipFile(fileobj=StringIO.StringIO(data))
uncompressed_data = zippy.read()

更好一点,完整的解决方案

from ftplib import FTP
import gzip
import StringIO

ftp = FTP('ftp.ncbi.nlm.nih.gov')
ftp.login() # Username: anonymous password: anonymous@

sio = StringIO.StringIO()
def handle_binary(more_data):
    sio.write(more_data)

resp = ftp.retrbinary("RETR pub/pmc/PMC-ids.csv.gz", callback=handle_binary)
sio.seek(0) # Go back to the start
zippy = gzip.GzipFile(fileobj=sio)

uncompressed = zippy.read()

实际上,即时进行解压缩会更好,但是我看不到使用内置库实现压缩的方法(至少不容易)。



 类似资料:
  • 我的目标是用扩展名解析协议缓冲区文件。pb。一串在Mac上使用自制软件下载Protobuff。运行protoc--版本,并具有libprotoc 3.1.0版本。 但当我运行Python时,它会说找不到模块。我改变了主意。pb文件名到\u pb2。py并在Python脚本中导入模块。 我正在使用谷歌文档,但仍然没有任何运气。我在编译Protobuf时也遇到了问题。so文件通过Python。我只是无

  • 本文向大家介绍Java缓冲读取器,包括了Java缓冲读取器的使用技巧和注意事项,需要的朋友参考一下 示例 介绍 该BufferedReader班是以外的包装Reader是有两个主要目的类: ABufferedReader为包装的提供缓冲Reader。这允许应用程序一次读取一个字符,而不会产生过多的I / O开销。 一个BufferedReader用于一次读取文本行提供的功能。 使用Buffered

  • 问题内容: 我知道 bufio 包中的golang中的特定功能。 Peek返回下一个n个字节, 而不会使阅读器前进 。在下一个读取调用中,字节停止有效。如果Peek返回的字节数少于n个字节,则它还会返回一个错误,解释读取短的原因。如果n大于b的缓冲区大小,则错误为ErrBufferFull。 我需要能够从阅读器读取特定数量的字节,以 使阅读器更先进 。基本上,与上面的功能相同,但是它使阅读器更高级

  • 问题内容: 任何人都可以解释我的类之间的区别,以及?我想阅读文本文件时使用哪一个? 问题答案: 好: 只是使用平台默认编码(urgh)读取文件的 是另一个的包装,增加了缓冲并可以一次读取一行 从各种不同的来源读取内容,但通常用于交互式输入。我个人觉得API的痛苦和晦涩。 要读取一个文本文件,我建议使用一个包裹在一个(这样你就可以指定编码),然后包裹在缓冲和在同一时间读取线的能力。 或者,您可以使用

  • 本文向大家介绍emacs 文件和缓冲区,包括了emacs 文件和缓冲区的使用技巧和注意事项,需要的朋友参考一下 示例 在Emacs中,文件的含义与操作系统中的含义相同,并且用于永久存储数据。甲缓冲器是正在编辑的文件的内部表示。可以使用将文件读取到缓冲区中C-x C-f,并且可以使用C-x C-s(将文件保存到当前位置)或C-x C-w(将文件写入其他位置,提示输入-等效于Save as)将缓冲区写

  • 在一个循环中,我正在读取一个流,该流在每个循环中被编码为UTF-8,10字节(比方说)。由于流首先被传递到缓冲区,所以在将其转换为UTF-8字符串之前,我必须以字节为单位指定其读取长度。我面临的问题是,有时它会读到部分的、不完整的字符。我需要解决这个问题。 是否有一种方法来检测字符串是否以不完整的字符结尾,或者对字符串的最后一个字符进行检查以确定这一点? 最好是“非单一编码”解决方案。