Connecting to multiple SFTP sites using pysftp in a loop: "AttributeError: 'Connection' object has no attribute 'CnOpts'"
Connecting to multiple SFTP sites using pysftp in a loop: "AttributeError: 'Connection' object has no attribute 'CnOpts'"
有两个 SFTP 站点我有用户名和密码。它们在它们内部和同一主机上都有相同的目录。我正在尝试在 Python 中编写代码以遍历这些站点并将文件保存在文件夹中。我从来没有写过从 SFTP 中提取数据的代码,所以如果我使用了一些错误的术语,请告诉我。
我不知道举个例子的最佳方式。我将添加我的代码,该代码在第一次迭代时有效,但在第二次迭代时崩溃并出现此错误:
AttributeError: 'Connection' object has no attribute 'CnOpts'
我还注意到,当我 运行 没有循环的代码并且一次只从一个 SFTP 中提取数据时,如果我第二次尝试 运行 代码,我会得到相同的结果错误。然后我清除内核,我可以再次 运行 该过程。
我的代码在第一次迭代时有效,然后在第二次迭代时崩溃,如下所示。此代码不会 运行 在您的机器上,但想到添加它以供参考。
import pandas as pd
import pysftp as sftp
data = {'UserName': ['User Name1', 'User Name2'],
'Password': ['Password-1', 'Password-2']}
user_password_df = pd.DataFrame(data)
## Creating the sftp connection
raw_ftp_list = []
cnopts = sftp.CnOpts()
cnopts.hostkeys = None
for x, j in user_password_df.iterrows():
cnopts = sftp.CnOpts()
cnopts.hostkeys = None
host = 'sampleftp.site.com'
user = j.iloc[0]
pswd = j.iloc[1]
with sftp.Connection(host=host, username=user, password=pswd, cnopts=cnopts) as sftp:
sftp.cwd('SAMPLE/DIR/') ## selecting remote directory
server_files = sftp.listdir()
# ...
我觉得我需要在 "reset" 我的连接的循环末尾添加一些东西,但我不知道那是什么。我尝试了一个简单的 del cnopts
来删除导致问题的变量。那没有用。我还尝试在迭代结束时添加 sftp.close()
但这也不起作用。此外,我需要此代码能够遍历无限的 sftp 站点,因为我的带有用户名和密码的数据框将得到更新,并且将来会创建更多站点。
如有任何建议或尝试的解决方案,我们将不胜感激。
谢谢!
开头,sftp
是一个模块。所以sftp.CnOpts()
指的是模块中的一个class。
但是使用 with ... as sftp
,您可以覆盖 sftp
标识符的含义。所以在另一次迭代中,sftp.CnOpts()
不再有效,因为 sftp
指的是 Connection
class 而不是 sftp
模块。
将您的 sftp
变量重命名为其他名称。
有两个 SFTP 站点我有用户名和密码。它们在它们内部和同一主机上都有相同的目录。我正在尝试在 Python 中编写代码以遍历这些站点并将文件保存在文件夹中。我从来没有写过从 SFTP 中提取数据的代码,所以如果我使用了一些错误的术语,请告诉我。
我不知道举个例子的最佳方式。我将添加我的代码,该代码在第一次迭代时有效,但在第二次迭代时崩溃并出现此错误:
AttributeError: 'Connection' object has no attribute 'CnOpts'
我还注意到,当我 运行 没有循环的代码并且一次只从一个 SFTP 中提取数据时,如果我第二次尝试 运行 代码,我会得到相同的结果错误。然后我清除内核,我可以再次 运行 该过程。
我的代码在第一次迭代时有效,然后在第二次迭代时崩溃,如下所示。此代码不会 运行 在您的机器上,但想到添加它以供参考。
import pandas as pd
import pysftp as sftp
data = {'UserName': ['User Name1', 'User Name2'],
'Password': ['Password-1', 'Password-2']}
user_password_df = pd.DataFrame(data)
## Creating the sftp connection
raw_ftp_list = []
cnopts = sftp.CnOpts()
cnopts.hostkeys = None
for x, j in user_password_df.iterrows():
cnopts = sftp.CnOpts()
cnopts.hostkeys = None
host = 'sampleftp.site.com'
user = j.iloc[0]
pswd = j.iloc[1]
with sftp.Connection(host=host, username=user, password=pswd, cnopts=cnopts) as sftp:
sftp.cwd('SAMPLE/DIR/') ## selecting remote directory
server_files = sftp.listdir()
# ...
我觉得我需要在 "reset" 我的连接的循环末尾添加一些东西,但我不知道那是什么。我尝试了一个简单的 del cnopts
来删除导致问题的变量。那没有用。我还尝试在迭代结束时添加 sftp.close()
但这也不起作用。此外,我需要此代码能够遍历无限的 sftp 站点,因为我的带有用户名和密码的数据框将得到更新,并且将来会创建更多站点。
如有任何建议或尝试的解决方案,我们将不胜感激。
谢谢!
开头,sftp
是一个模块。所以sftp.CnOpts()
指的是模块中的一个class。
但是使用 with ... as sftp
,您可以覆盖 sftp
标识符的含义。所以在另一次迭代中,sftp.CnOpts()
不再有效,因为 sftp
指的是 Connection
class 而不是 sftp
模块。
将您的 sftp
变量重命名为其他名称。