2016-10-12 5 views
0

У меня есть проблема буфера с помощью paramiko, я нашел тот же вопрос here и один из решений утверждает, что:Paramiko Buffer вопрос

Вместо использования .get(), если вы просто звоните .Open (), чтобы получить экземпляр SFTPFile , а затем вызовите .read() на этом объекте или просто передайте его в текстовую библиотеку с функцией 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) 

Как сохранить этот файл, как-объект в формате CSV в моем локальном компьютере? (исходный файл также является csv)

+0

Возможно, что-то вроде этого http://www.programcreek.com/python/example/618/shutil.copyfileobj, 'copyfileobj (sftp_file, open ('save.csv', 'wb'), 1024)' – sal

+0

I 'confused о ваших соглашениях об именах ... 'server_address' содержит имя удаленного файла? Тогда 'shutil.copyfileobj (sftp_file, open ('localfile', 'wb'))' должен сделать это. Вы можете найти более высокую производительность, указав больший размер блока (например, 'blocksize = 1048576', затем' shutil.copyfileobj (sftp_file, open ('localfile', 'wb', blockize), blockize) ' – tdelaney

+0

@tdelaney спасибо, да I исправил это, чтобы быть более ясным. – rlartiga

ответ

1

Вот рабочий пример, который извлекает копии тестового файла на вашем локальном компьютере. Файл намного меньше 1 GIG, но дает общий план.

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 

Мы ожидаем, что некоторые замедляются, потому что есть чтение и запись а также сетевые затраты (его на локальный хост, так на самом деле не трогать провода) , но это кажется медленным. Я использую маломощный ноутбук с двумя ядрами, а между этим приложением и sshd, использовал большую часть процессора, предположительно, для шифрования. Более мощная машина может работать лучше.

+0

Я пробовал с моим учетные данные вашего кода, работает как шарм! – rlartiga

 Смежные вопросы

  • Нет связанных вопросов^_^