Lire un fichier à partir du serveur SSH à l'aide de Python
Je suis en train de lire un fichier à partir d'un serveur à l'aide de SSH à partir de Python. Je suis à l'aide de Paramiko pour vous connecter. Je peux me connecter au serveur et exécuter une commande comme cat filename
et récupérer les données à partir du serveur, mais certains fichiers, je suis en train de lire sont autour de 1 GO ou plus en taille.
Comment puis-je lire le fichier sur le serveur, ligne par ligne à l'aide de Python?
Informations supplémentaires: Ce qui est régulièrement faire est d'exécuter un cat filename
de commande et de stocker le résultat dans une variable et le travail de ça. Mais depuis le fichier est assez gros, je suis à la recherche d'un moyen de lire un fichier ligne par ligne sur le serveur.
EDIT: je peux lire un tas de données et de le diviser en lignes, mais le problème est que les données reçues dans la mémoire tampon ne comprend pas toujours les lignes complètes. Par exemple, si la mémoire tampon a 300 lignes, la dernière ligne ne peuvent être la moitié de la ligne sur le serveur et le prochain demi serait récupéré dans le prochain appel au serveur. Je veux lignes complètes
EDIT 2: quelle commande dois-je utiliser pour imprimer les lignes dans un fichier dans une certaine plage. Comme l'impression 100 premières lignes, puis le côté 100 et ainsi de suite? De cette façon, le tampon sera toujours contenir des lignes complètes.
- Alors, êtes-vous de lire ligne par ligne parce que vous ne voulez pas mettre les données dans un script shell variable? Sur l'extrémité de la variable get set? Le local de la fin? Est-il important de traiter d'une ligne sur la proximité de la fin avant de lire le prochain sur le fond?
Vous devez vous connecter pour publier un commentaire.
Paramiko de
SFTPClient
de la classe vous permet d'obtenir un fichier objet en forme pour lire des données à distance à partir d'un fichier dans un Pythonic façon.En supposant que vous avez ouvert un
SSHClient
:Voici une extension pour @Matt Bonne réponse:
.close()
méthode permettra de le faire. La mise en œuvre declosing
est trivial, voir svn.python.org/view/python/trunk/Lib/contextlib.py?view=markupwith sftp.open('remote_filename') as f:
également de travaillerclosing()
appels inutiles).Qu'entendez-vous par "ligne par ligne" - il y a beaucoup de tampons de données entre les hôtes du réseau, et aucun d'entre eux sont en ligne axée sur les résultats.
De sorte que vous pouvez lire un tas de données, puis de le diviser en lignes à la fin proche.
Ou vous pouvez avoir un processus de lire un tas de données à l'extrême fin, le briser, et format ligne par ligne et l'envoyer à vous.
La seule différence je ce moyen permet de réduire le volume de données dans un réseau de tuyaux. Dans votre situation, il peut, ou ne peut pas d'importance.
Il n'y a rien de mal en général avec l'aide de
cat
sur un SSH pipe pour déplacer des gigaoctets de données.