有两个SFTP站点,我有用户名和密码。它们的内部和主机上都有相同的目录。我试图用Python编写一段代码来循环这些站点,并将文件保存在文件夹中。我从来没有写过从SFTP中提取数据的代码,所以如果我使用了一些错误的术语,请告诉我。
我不知道怎样才是最好的例子。我将添加在第一次迭代中工作的代码,但在第二次迭代中使用以下错误崩溃:
AttributeError:“Connection”对象没有属性“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()
# ...我觉得我需要在循环的末尾添加一些东西来“重置”我的连接,但是我不知道那是什么。我尝试了一个简单的del cnopts来删除导致问题的变量。那不起作用。我还尝试在迭代结束时添加sftp.close(),但这也不起作用。另外,我需要这段代码才能遍历无限的sftp站点,因为我的用户名和密码的数据帧将得到更新,将来还会创建更多的站点。
如有任何建议或解决方案,将不胜感激。
谢谢!
发布于 2020-05-14 17:10:37
乞讨时,sftp是一个模块。因此,sftp.CnOpts()引用了模块中的一个类。
但是使用with ... as sftp,您可以重写sftp标识符的含义。因此,在另一个迭代中,sftp.CnOpts()不再有效,因为sftp引用的是Connection类,而不是sftp模块。
将sftp变量重命名为其他变量。
https://stackoverflow.com/questions/61802162
复制相似问题