如何使用Python远程读取服务器上的AVRO文件
直接通过SFTP远程读取AVRO文件
可以直接结合Paramiko的SFTP文件对象与FastAvro的读取功能实现远程读取,无需将文件下载到本地。因为FastAvro的reader()方法支持接收类文件对象,而Paramiko的SFTP打开文件后返回的对象正好符合这个要求。
完整实现代码如下:
from fastavro import reader import paramiko avro_records = [] # 建立SSH连接 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=myHostname, username=myUsername, password=myPassword) try: # 打开SFTP会话 sftp = ssh.open_sftp() # 以二进制只读模式打开远程AVRO文件 with sftp.open('/remotedir/avro/file.avro', 'rb') as remote_fo: # 用FastAvro读取远程文件对象 avro_reader = reader(remote_fo) for record in avro_reader: avro_records.append(record) finally: # 确保关闭SSH连接 ssh.close()
关键说明:
- 使用
sftp.open()替代本地的open()方法,返回的remote_fo是一个支持随机访问的类文件对象,完全兼容FastAvro的读取要求。 - 若使用Paramiko 2.7及以上版本,可通过嵌套
with语句自动管理连接与文件资源,简化代码:
from fastavro import reader import paramiko avro_records = [] # 使用with语句自动管理SSH连接 with paramiko.SSHClient() as ssh: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=myHostname, username=myUsername, password=myPassword) with ssh.open_sftp() as sftp: with sftp.open('/remotedir/avro/file.avro', 'rb') as remote_fo: avro_reader = reader(remote_fo) for record in avro_reader: avro_records.append(record)
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

