我们在服务器上跑完WRF时,不免会有许多的wrfout文件,这时候就需要进行后处理。 当然我们可以直接在服务器上进行后处理,但有时由于一些原因,比如笔者的服务器上无法连接conda channel(ˉ▽ˉ;)…,便将其下载至本地再进行后处理。 通过xftp软件一个个下载未免有些困难,正巧python也有支持ssh与sftp的库,我们就用python批量下载吧。
SSH连接
paramiko库提供了多种SSH连接方式,具体可以参考这篇博客:python paramiko和ssh 我这里选用了比较普通的方式:
import paramiko
import os,stat
trans = paramiko.Transport(('123.18.1.123', 22))
trans.connect(username='yourusrname', password='')
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)
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
trans = paramiko.Transport(('123.18.1.123', 22))
trans.connect(username='yourusrname', password=' ')
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!")
|