Python当我获取或尝试读取sftp文件时发生了什么?

时间:2017-04-21 02:26:32

标签: python sftp pysftp

这里有一个关于stfp如何运作的问题。我很想知道究竟发生了什么"在幕后"当我连接到SFTP并下载文件时。

我一直在使用一些连接到sftp服务器的继承代码,并列出了一个目录:例如。

sftp = pysftp.Connection(host='xxxxx', username='xxxx', password='xxxxx', cnopts=cnopts)
sftp.cwd('/some_dir')

server_files = sftp.listdir()

从那里开始,我们想要将server_files[1]读入pandas数据框:

我不能简单地尝试阅读我想要的文件,即

pd.read_csv(server_files[1])
# FileNotFoundError: [Errno 2] No such file or directory: 

相反;我必须首先get文件,如下所示。

sftp.get(server_files[1])
pd.read_csv(server_files[1])
# Success!

这很有效。没问题。不过我的问题是:

工作记忆中的

server_files[1]对象"存储"?我在type(server_file[1])操作之前和之后都执行了get,两个结果都是str,向我表明对象本身没有改变。因此,我并不真正了解该文件的数据保存位置。为什么我不需要做my file = sftp.get(server_file[1])之类的事情?它如何才能起作用的名称'该文件?

我很欣赏这个如何使代码工作的问题,而不是它是如何运作的,但是我会很感激在理解这一点时提供一些帮助。

干杯

约翰

1 个答案:

答案 0 :(得分:1)

看起来像是一种误解。

pysftp.get(server_files[1])将远程文件server_files[1] 下载到当前工作目录中的本地文件 server_files[1],就像您一样不要指定localpath(第二个)可选参数。

引用pysftp.get documentation(强调我的):

  

localpath (str) - 要复制的本地路径和文件名,目标。 如果未指定,则将文件复制到本地当前工作目录

因此pd.read_csv(server_files[1])读取本地副本。它魔法地读取远程文件。

server_files[1]确实是一个包含文件名的简单字符串。没什么好看的。