从SFTP文件中读取CSV/Excel文件,使用Pandas对这些文件进行一些更改,并保存回来

mhd8tkvw  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(165)

我想在一个安全的SFTP文件夹中读取一些CSV/Excel文件,在这些文件中做一些更改(在每个文件中固定更改,如删除列2),将它们上传到Postgre DB,并将它们上传到Python中的不同SFTP路径
最好的方法是什么?
我已经使用pysftp库连接到SFTP,并正在阅读Excel:

import pysftp
import pandas as pd

myHostname = "*****"
myUsername = "****"
myPassword = "***8"
cnopts =pysftp.CnOpts()
cnopts.hostkeys = None  

sftp=pysftp.Connection(host=myHostname, username=myUsername, 
password=myPassword,cnopts=cnopts)
print ("Connection succesfully stablished ... ")
sftp.chdir('test/test')
#sftp.pwd
a=[]
for i in sftp.listdir_attr():
    with sftp.open(i.filename) as f:
        df=pd.read_csv(f)

字符串
我应该如何继续上传到DB并使CSV的更改永久化?

fdbelqdn

fdbelqdn1#

你已经完成了下载部分。
对于上传部分,请参阅How to Transfer Pandas DataFrame to .csv on SFTP using Paramiko Library in Python?-虽然它是用于Paramiko的,pysftp Connection.open方法的行为与Paramiko SFTPClient.open相同,所以代码是相同的(尽管你使用should not use pysftp)。
完整的代码可以是:

with sftp.open("/remote/path/data.csv", "r+", bufsize=32768) as f:
    # Download CSV contents from SFTP to memory
    df = pd.read_csv(f)

    # Modify as you need (just an example)
    df.at[0, 'Name'] = 'changed'

    # Upload the in-memory data back to SFTP
    f.seek(0)
    df.to_csv(f, index=False)
    # Truncate the remote file in case the new version of the contents is smaller
    f.truncate(f.tell())

字符串
上面的内容更新了同一个文件。如果您想上传到其他文件,请使用以下内容:

# Download CSV contents from SFTP to memory
with sftp.open("/remote/path/source.csv", "r") as f:
    df = pd.read_csv(f)

# Modify as you need (just an example)
df.at[0, 'Name'] = 'changed'

# Upload the in-memory data back to SFTP
with sftp.open("/remote/path/target.csv", "w", bufsize=32768) as f:
    df.to_csv(f, index=False)


有关bufsize的用途,请参阅:
Writing to a file on SFTP server opened using Paramiko/pysftp "open" method is slow

  • 强制性警告:不要设置cnopts.hostkeys = None,除非你不关心安全性。有关正确的解决方案,请参见Verify host key with pysftp *。
z0qdvdin

z0qdvdin2#

这是一个问题中的几个问题:)
我建议采用这种方法:
1.制作文件的本地副本(不确定它有多大,在本地机器和sftp服务器之间来回移动没有意义。你可以用get方法吗
1.使用pandas对数据进行操作,然后使用to_csv方法将其转储回csv
1.使用pandas.io或纯SQLAlchemy将数据加载到postgree。检查文档here
1.使用put方法将文件上传到所需的目标

相关问题