2016-10-12 6 views
0

Ich habe ein Problem des Puffers paramiko verwenden, fand ich die gleiche Frage here und eine der Lösungen heißt es:paramiko Buffer Ausgabe

Anstatt mit .get(), wenn Sie nur .open nennen (), um eine SFTPFile Instanz zu erhalten, rufen Sie dann .read() für dieses Objekt auf oder übergeben Sie es einfach an die Python-Standardbibliotheksfunktion shutil.copyfileobj(), um den Inhalt herunterzuladen. Das sollte den Paramiko-Prefetch-Cache vermeiden und Ihnen erlauben, die Datei herunterzuladen, auch wenn sie nicht ganz so schnell ist.

Nun, wenn ich habe:

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) 

Wie speichere ich diese Datei-like-Objekt in einer csv in meinem lokalen PC? (Die Originaldatei ist auch eine CSV)

+0

Wahrscheinlich so etwas wie http://www.programcreek.com/python/example/618/shutil.copyfileobj, 'copyfileobj (sftp_file, öffnen ('save.csv', 'wb'), 1024)' – sal

+0

I Ich bin verwirrt über Ihre Namenskonventionen ... 'server_address' enthält den Namen der Remote-Datei? Dann sollte 'shutil.copyfileobj (sftp_file, open ('localfile', 'wb'))' es tun. Sie können eine bessere Leistung finden, indem Sie eine größere Blockgröße angeben (zB 'blocksize = 1048576' dann' shuthil.copyfileobj (sftp_file, offen ('localfile', 'wb', blocksize), Blockgröße) ' – tdelaney

+0

@tdelaney Danke, ja ich korrigierte das, um klarer zu sein – rlartiga

Antwort

1

Hier ist ein Arbeitsbeispiel, das eine Testdatei auf Ihrem lokalen Rechner kopiert. Die Datei ist viel kleiner als 1 GIG, gibt aber den allgemeinen Plan.

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" 

Laufen auf meinem Rechner habe ich

Enter password: 
writing test file... 
file size 25000000, 21017 KB/Sec 
copying file... 
10.225 seconds, 2387 KB/Sec 

Wir erwarten, dass einige langsam nach unten, weil es ein Lese- und ein Schreib-und Netzkosten (sein zu lokalen Host so, dass es nicht den Draht berühren) , aber das scheint irgendwie langsam. Ich benutze einen Low-Power-Laptop mit 2 Kernen und zwischen dieser App und sshd, verwendet viel von der CPU, vermutlich um die Verschlüsselung zu tun. Eine Maschine mit höherer Leistung funktioniert möglicherweise besser.

+0

Ich habe es mit meinem versucht Credentials Ihr Code, funktioniert wie ein Charme! Vielen Dank – rlartiga