使用 Python 使用 SSH 从服务器读取文件

     2023-03-04     121

关键词:

【中文标题】使用 Python 使用 SSH 从服务器读取文件【英文标题】:Read a file from server with SSH using Python 【发布时间】:2010-12-08 11:48:39 【问题描述】:

我正在尝试使用来自 Python 的 SSH 从服务器读取文件。我正在使用 Paramiko 进行连接。我可以连接到服务器并运行类似cat filename 的命令并从服务器取回数据,但我尝试读取的一些文件大小约为 1 GB 或更大。

如何使用 Python 逐行读取服务器上的文件?

附加信息:经常做的是运行cat filename 命令并将结果存储在一个变量中并解决它。但是由于这里的文件很大,所以我正在寻找一种方法来从服务器上逐行读取文件。

编辑:我可以读取一堆数据并将其分成几行,但问题是缓冲区中接收到的数据并不总是包含完整的行。例如,如果缓冲区有 300 行,则最后一行可能只是服务器上行的一半,而下一半将在下一次调用服务器时获取。我想要完整的线条

编辑 2:我可以使用什么命令来打印某个范围内的文件中的行。就像打印前 100 行,然后打印下 100 行等等?这样缓冲区将始终包含完整的行。

【问题讨论】:

【参考方案1】:

你所说的“逐行”是什么意思 - 网络主机之间有很多数据缓冲区,而且它们都不是面向行的。

所以你可以读取一堆数据,然后在近端将其拆分成行。

ssh otherhost cat somefile | python process_standard_input.py | do_process_locally

或者您可以让一个进程在远端读取一堆数据,将其分解,并逐行格式化并发送给您。

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

我关心的唯一区别是如何减少有限网络管道上的数据量。在您的情况下,这可能重要,也可能不重要。

在 SSH 管道上使用 cat 来移动千兆字节的数据通常没有任何问题。

【讨论】:

【参考方案2】:
#!/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)

【讨论】:

paramiko 的好例子,但再次强调了这种任务的非面向线的性质。 继续阅读,直到你得到一个换行符或其他换行符。【参考方案3】:

Paramiko's SFTPClient class 允许你获取一个类文件对象,以 Python 方式从远程文件中读取数据。

假设你有一个开放的SSHClient:

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()

【讨论】:

+1,比和猫混在一起要好得多(因为我喜欢猫科动物!-)。 虽然正确,但这种幼稚的实现非常缓慢。它需要一些改进才能获得良好的性能。见Reading file opened with Python Paramiko SFTPClient.open method is slow。【参考方案4】:

这是@Matt Good's answer 的扩展,使用fabric:

from fabric.connection import Connection

with Connection(host, user) as c, c.sftp() as sftp,   \
         sftp.open('remote_filename') as file:
    for line in file:
        process(line)

旧织物 1 个答案:

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)

【讨论】:

我以前从未见过 contextlib.closure 。所以这可以让你将任何带有 close() 方法的东西变成一个类似上下文管理器的东西,尽管它可能没有 __enter__ 和 __exit__? @hughbrown:是的。任何带有.close() 方法的对象都可以。 closing的实现很简单,见svn.python.org/view/python/trunk/Lib/contextlib.py?view=markup 事实上with sftp.open('remote_filename') as f: 也可以使用 @user128285:它可能取决于特定的库版本(较新的版本不需要closing() 调用)。 @AllanRuin:是的,fabric 2 需要不同的代码。我已经更新了答案。【参考方案5】:

看起来早在 2013 年 9 月 paramiko 就为这些对象添加了原生支持上下文管理器的功能,因此如果您想要 Matt's clean answer 和 jfs's context manager,现在您只需要:

with ssh_client.open_sftp() as sftp_client:
    with sftp_client.open('remote_filename') as remote_file:
        for line in remote_file:
            # process line

【讨论】:

使用 Node.js 和 SSH2 从 SFTP 服务器读取文件

】使用Node.js和SSH2从SFTP服务器读取文件【英文标题】:ReadingfilefromSFTPserverusingNode.jsandSSH2【发布时间】:2016-09-1909:21:53【问题描述】:我在Node.js中处理读取流时遇到了一个非常奇怪的问题。我正在使用SSH2在我和sftp服务器之间创... 查看详情

如何使用 Python 直接从服务器读取 excel 文件

】如何使用Python直接从服务器读取excel文件【英文标题】:HowtoreadanexcelfiledirectlyfromaServerwithPython【发布时间】:2018-01-2604:10:00【问题描述】:场景:我正在尝试从服务器文件夹中读取一个excel文件,然后将该文件的每个工作表读... 查看详情

从文件性能方面提取数据(子进程与文件读取)Python

...Python【发布时间】:2016-08-2102:55:09【问题描述】:想知道使用python从本地托管文件中读取数据的最有效方法是什么。要么使用子进程,要么只cat文件的内容:ssh=subprocess.Popen([\'cat\',dir_t 查看详情

使用 Python 检查远程 SSH 服务器上的文件是不是存在

】使用Python检查远程SSH服务器上的文件是不是存在【英文标题】:CheckingafileexistenceonaremoteSSHserverusingPython使用Python检查远程SSH服务器上的文件是否存在【发布时间】:2013-01-0118:43:31【问题描述】:我有两台服务器A和B。我想发送... 查看详情

在使用 python 写入时从日志文件中读取

】在使用python写入时从日志文件中读取【英文标题】:Readfromalogfileasit\'sbeingwrittenusingpython【发布时间】:2011-03-1810:41:37【问题描述】:我正在尝试找到一种使用python实时读取日志文件的好方法。我想在写入时一次处理一个日志... 查看详情

使用 Python 直接从 zip 文件中读取 xml 文件

】使用Python直接从zip文件中读取xml文件【英文标题】:ReadxmlfilesdirectlyfromazipfileusingPython【发布时间】:2016-02-1418:48:28【问题描述】:我有以下zip文件结构:some_file.zip/folder/folder/files.xml所以我在zip文件的子文件夹中有很多xml文件... 查看详情

使用 Python 从目录中读取所有 csv 文件

】使用Python从目录中读取所有csv文件【英文标题】:ReadinallcsvfilesfromadirectoryusingPython【发布时间】:2016-02-0321:26:12【问题描述】:我希望这不是微不足道的,但我想知道以下几点:如果我有一个包含ncsv文件的特定文件夹,我如... 查看详情

如何使用 Python 和 Paramiko 创建 SSH 隧道?

...和关闭隧道的简单代码示例。【问题讨论】:您是在寻找服务器还是客户端,或者两者兼而有之?您确定在Python中需要它吗?使用 查看详情

如何使用 Python 从 PDF 文件中读取简单文本?

】如何使用Python从PDF文件中读取简单文本?【英文标题】:HowtoreadsimpletextfromaPDFfilewithPython?【发布时间】:2020-05-1016:07:07【问题描述】:需要解析一个PDF文件以便只提取文本的前几行,并寻找不同的Python包来完成这项工作,但没... 查看详情

使用 SSH 将文件从服务器复制到本地计算机 [关闭]

】使用SSH将文件从服务器复制到本地计算机[关闭]【英文标题】:CopyingfilesfromservertolocalcomputerusingSSH[closed]【发布时间】:2015-08-1317:28:11【问题描述】:我无法使用SSH从远程服务器复制文件。使用PuTTY我使用SSH登录到服务器。找到... 查看详情

Python / 使用 Pandas 从文本文件中读取和分组数据

】Python/使用Pandas从文本文件中读取和分组数据【英文标题】:Python/ReadandgroupdatafromtextfilewithPandas【发布时间】:2019-04-2414:07:13【问题描述】:我有一个文本文件如下:Sentence:1Polarity:N5puanverdimodaanistonungüzelyüzününhatırına.Sentence:2... 查看详情

如何使用 Python Jupyter Notebook 通过 KMS 加密从 S3 读取文件

】如何使用PythonJupyterNotebook通过KMS加密从S3读取文件【英文标题】:HowtoreadafilefromS3withKMSencryptionusingPythonJupyterNotebook【发布时间】:2021-02-0821:58:25【问题描述】:我正在尝试使用spark.read.csv从S3读取文件。但是,我无法读取具有KMS... 查看详情

仅在使用python更新后如何从输入文件中读取文本

】仅在使用python更新后如何从输入文件中读取文本【英文标题】:Howtoreadatextfrominputfileonlyafteritisupdatedusingpython【发布时间】:2011-05-1407:47:48【问题描述】:实际上我会将来自我的application1的输入提供给input.txt,实习生会触发usedp... 查看详情

使用 python-3.x 从 zip 存档中读取 CSV 文件

】使用python-3.x从zip存档中读取CSV文件【英文标题】:ReadingCSVfilesfromziparchivewithpython-3.x【发布时间】:2018-05-0918:20:23【问题描述】:我有一个压缩存档,其中包含多个csv文件。例如,假设myarchive.zip包含myfile1.csv、myfile2.csv、myfile3.... 查看详情

如何在 python 中使用 pyarrow 从 S3 读取分区镶木地板文件

】如何在python中使用pyarrow从S3读取分区镶木地板文件【英文标题】:HowtoreadpartitionedparquetfilesfromS3usingpyarrowinpython【发布时间】:2017-12-1808:47:31【问题描述】:我正在寻找使用python从s3中读取多个分区目录中的数据的方法。data_fold... 查看详情

如何在 python 中使用 awswrangler 从 S3 读取所有镶木地板文件

】如何在python中使用awswrangler从S3读取所有镶木地板文件【英文标题】:HowtoreadallparquetfilesfromS3usingawswranglerinpython【发布时间】:2021-09-2920:02:53【问题描述】:需要使用ext.parquet读取所有parquet文件s3_path="s3://buckte/table/files.parquet"df=... 查看详情

使用python,如何从第七行开始读取文件?(代码片段)

我有一个文本文件结构:datedownlanduserdatedata1date2201102foobar20050201101foobar30035因此不需要前六行文件。文件名:dnw.txtf=open('dwn.txt','rb')如何从第7行开始将此文件“拆分”为EOF?答案withopen('dwn.txt')asf:foriinxrange(6):f.next()forlineinf: 查看详情

从文本文件中读取句子并使用 Python 3 附加到列表中 [关闭]

】从文本文件中读取句子并使用Python3附加到列表中[关闭]【英文标题】:ReadingsentencesfromatextfileandappendingintoalistwithPython3[closed]【发布时间】:2015-01-2807:55:26【问题描述】:我无法弄清楚如何获取一个冗长文档的文本文件,并将该... 查看详情