我遇到了使用paramiko缓冲的问题,我发现了同样的问题here,其中一个解决方案是:
而不是使用.get(),如果只调用.open()来获取SFTPFile实例,那么调用该对象上的.read(),或者将其传递给Python库函数shutil.copyfileobj()来下载内容。这应该避免Paramiko预取缓存,并允许您下载文件,即使它不是那么快。
现在如果我有:
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host,username=user,password=pwd)
sftp=ssh.open_sftp()
sftp_file=sftp.open(remote_file_adress)如何将这个类似文件的对象保存在本地pc中的csv中?(原始文件也是csv )
发布于 2016-10-12 18:44:48
下面是一个在本地机器上获取一个测试文件副本的工作示例。该文件比1G小得多,但给出了总体计划。
import paramiko
import os
import shutil
import time
import getpass
# get params
user = getpass.getuser()
pwd = getpass.getpass("Enter password: ")
bufsize = 2**20
host = 'localhost'
test_file_lines = 1000000
# create test file
now = time.asctime()
testfile_path = os.path.abspath('deleteme')
local_path = 'deleteme.copy'
print('writing test file...')
start = time.time()
with open(testfile_path, 'w') as fp:
for _ in range(test_file_lines):
fp.write(now + '\n')
delta = time.time() - start
file_size = os.stat(testfile_path).st_size
print("file size %d, %d KB/Sec" % (file_size, file_size/1024/delta))
# make connection
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host,username=user,password=pwd)
sftp=ssh.open_sftp()
sftp_file=sftp.open(testfile_path, bufsize=bufsize)
print('copying file...')
start = time.time()
shutil.copyfileobj(sftp_file,
open(local_path, 'wb', bufsize),
bufsize)
delta = time.time() - start
print('%.3f seconds, %d KB/Sec' % (delta, file_size/1024/delta))
#assert open(testfile_path).read() == open(local_path).read(), "files match"在我的机器上运行
Enter password:
writing test file...
file size 25000000, 21017 KB/Sec
copying file...
10.225 seconds, 2387 KB/Sec我们预计会有一些慢下来,因为有一个读和写加上网络成本(它的本地主机,所以不真正接触电线),但这似乎有点慢。我使用的是一台2核的低功耗笔记本电脑,在这个应用程序和sshd之间,我使用了大量的cpu,大概是用来加密的。一台动力更高的机器可能工作得更好。
https://stackoverflow.com/questions/40005531
复制相似问题