WRF后处理:使用python paramiko库将服务器中wrfout文件批量下载至本地(sftp.get)/python通过sftp远程批量传输文件/sftp OSError: [Errno 22

我们在服务器上跑完WRF时,不免会有许多的wrfout文件,这时候就需要进行后处理。
当然我们可以直接在服务器上进行后处理,但有时由于一些原因,比如笔者的服务器上无法连接conda channel(ˉ▽ˉ;)…,便将其下载至本地再进行后处理。
通过xftp软件一个个下载未免有些困难,正巧python也有支持ssh与sftp的库,我们就用python批量下载吧。

SSH连接

paramiko库提供了多种SSH连接方式,具体可以参考这篇博客:python paramiko和ssh
我这里选用了比较普通的方式:

import paramiko
import os,stat
# 实例化一个transport对象
trans = paramiko.Transport(('123.18.1.123', 22))
# 建立连接
trans.connect(username='yourusrname', password='')
# 将sshclient的对象的transport指定为以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

成功的话会打印出信息,比如:
在这里插入图片描述

Sftp文件传输

python的sftp文件传输非常简单,如果是单个文件,只要加上:

sftp=paramiko.SFTPClient.from_transport(scp)
#Copy a remote file (remotepath) from the SFTP server to the local host
sftp.get('remot path','local path')

即可,即创建一个ssh连接后,使用命令sftp.get命令下载即可,同样。上传只需要sftp.put即可。
注意:此处的local path 与remote path都是完整的路径+文件名,即path+fillname的形式,不可以只输入路径。且支持单文件下载

sftp批量传输

想要批量传输的话,思路也很简单,遍历文件夹下的文件,随后传输。
比如说,再linux下建一个文件夹mkdir,将wrfout文件全部移至该文件夹下,随后遍历文件夹,下载即可。

remote_dir="/public/home/zhangzilu/Build_WRF/WRF-4.3.3/run/wrfout/"
local_dir="F:/wrfout/mp_201805/"
files=sftp.listdir("/public/home/zhangzilu/Build_WRF/WRF-4.3.3/run/wrfout/")
for f in files:
        sftp.get(os.path.join(remote_dir,f),os.path.join(local_dir,(f1+'.nc')))
    # 关闭连接
    trans.close()

看起来非常简单,但其中也会有坑。

报错信息

OSError: [Errno 22] Invalid argument
上网查询这个错误,得到的回答都是文件路径错误,‘/‘与’'混用,但是我并不是这个错误,这时候重点来了
我们都知道,wrfout的文件命名规则为wrfout_d0*YYYY-MM_DD_hh:mm:ss
然而**,在window下’:‘为敏感字符,不能出现在文件名里!**
这时候解决办法也很简单:用replace把’:"换成’
"就好了。
Windows的敏感字符还有 "?*/\|.:><" 它们都不能出现在文件名里。

for f in files:
        print('')
        print ('Beginning to download file',f)
        print ('Downloading file:',(f+'.nc'))
        f1=f.replace(':', '_')
        sftp.get(os.path.join(remote_dir,f),os.path.join(local_dir,(f1+'.nc')))
        print ('Download file success',f)
        print ('#################################')
    # 关闭连接
    trans.close()

下载成功:
在这里插入图片描述
完整代码:

import paramiko
import os,stat
# 实例化一个transport对象
trans = paramiko.Transport(('123.18.1.123', 22))
# 建立连接
trans.connect(username='yourusrname', password=' ')
# 将sshclient的对象的transport指定为以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())
remote_dir="/public/home/zhangzilu/Build_WRF/WRF-4.3.3/run/wrfout/"
local_dir="F:/wrfout/mp_201805/"
try:
    for f in files:
        print('')
        print ('Beginning to download file',f)
        print ('Downloading file:',(f+'.nc'))
        f1=f.replace(':', '_')
        sftp.get(os.path.join(remote_dir,f),os.path.join(local_dir,(f1+'.nc')))
        print ('Download file success',f)
        print ('#################################')
    # 关闭连接
    trans.close()
except Exception:
    print ("connect error!")
    

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值