una txt linea leer importar especifica como archivos archivo python file-io

txt - Lee un archivo del servidor con ssh usando python



paramiko (4)

Estoy tratando de leer un archivo de un servidor usando ssh de python. Estoy usando paramiko para conectarme. Puedo conectarme al servidor y ejecutar un comando como ''cat filename'' y recuperar los datos del servidor, pero algunos archivos que intento leer tienen un tamaño de 1 GB o más.

¿Cómo puedo leer el archivo en el servidor línea por línea usando Python?

Información adicional: lo que se hace regularmente es ejecutar un comando ''cat filename'' y almacenar el resultado en una variable y resolverlo. Pero dado que el archivo aquí es bastante grande, estoy buscando una forma de leer un archivo línea por línea en el servidor.

EDITAR: Puedo leer un montón de datos y dividirlos en líneas, pero el problema es que los datos recibidos en el búfer no siempre incluyen las líneas completas. por ejemplo, si el buffer tiene 300 líneas, la última línea solo puede ser la mitad de la línea en el servidor y la siguiente mitad será captada en la siguiente llamada al servidor. Quiero líneas completas

EDIT 2: ¿qué comando puedo usar para imprimir líneas en un archivo en un cierto rango? ¿Como imprimir las primeras 100 líneas, luego las siguientes 100 y así sucesivamente? De esta forma, el buffer siempre contendrá líneas completas.


¿Qué quiere decir con "línea por línea"? Hay muchos búferes de datos entre los hosts de la red, y ninguno de ellos está orientado a la línea.

Entonces puede leer un montón de datos y luego dividirlos en líneas al final.

ssh otherhost cat somefile | python process_standard_input.py | do_process_locally

O puede hacer que un proceso lea un montón de datos en el otro extremo, descomponerlos y formatearlos línea por línea y enviárselos.

scp process_standard_input.py otherhost ssh otherhost python process_standard_input.py somefile | do_process_locally

La única diferencia que me preocupa es de qué forma se reduce el volumen de datos en una tubería de red limitada. En su situación, puede o no ser importante.

No hay nada malo en general con el uso de cat sobre un conducto SSH para mover gigabytes de datos.


Aquí hay una extensión de la respuesta de @Matt Good :

from contextlib import closing from fabric.network import connect with closing(connect(user, host, port)) as ssh, / closing(ssh.open_sftp()) as sftp, / closing(sftp.open(''remote_filename'')) as file: for line in file: process(line)


Paramiko''s clase Paramiko''s SFTPClient permite obtener un objeto similar a un archivo para leer datos de un archivo remoto de forma pitonica.

Suponiendo que tiene un SSHClient abierto:

sftp_client = ssh_client.open_sftp() remote_file = sftp_client.open(''remote_filename'') try: for line in remote_file: # process line finally: remote_file.close()


#!/usr/bin/env python import paramiko import select client = paramiko.SSHClient() client.load_system_host_keys() client.connect(''yourhost.com'') transport = client.get_transport() channel = transport.open_session() channel.exec_command("cat /path/to/your/file") while True: rl, wl, xl = select.select([channel],[],[],0.0) if len(rl) > 0: # Must be stdout print channel.recv(1024)