2016-03-08 69 views
0

我对Python编程非常陌生,并且我编写了一个脚本来自动通过SFTP将文件上传到远程计算机。该剧本的作品奇妙,但有一个问题,我似乎无法弄清楚。如果我在我想上传的文件所在的目录中,一切都很顺利。但是,当我键入不在所述目录中的文件名时,它不会那样。每次浏览到不同的文件夹都是一件麻烦事。我知道我可以将这些文件整合到一个文件夹中......但我很想尝试将这些文件自动化。让Python脚本在单独目录中定位文件

/Downloads目录是硬编码的,因为这是大多数工具驻留的地方,有谁知道我可以如何调整这一行代码来获取匹配的文件名,而不管文件所在的目录是什么?

这是我写:

#! /usr/bin/python2 

# includes 

import thirdpartylib 
import sys 

if len(sys.argv) != 6: 
    print "Usage: %s file url port username password" % sys.argv[0] 
    exit(0) 
file = sys.argv[1] 
host = sys.argv[2] 
port = int(sys.argv[3]) 
username = sys.argv[4] 
password = sys.argv[5] 
filelocation = "Downloads/%s" % file 

transport = thirdpartylib.Transport((host, port)) 
transport.connect(username=username, password=password) 

sftp = thirdpartylib.SFTPClient.from_transport(transport) 

sftp.put(file, filelocation) 

sftp.close() 
transport.close() 

回答

2

首先,如果你做与文件路径的任何工作,建议你使用一些内置功能来构建它们,以确保您有适当的文件分隔符等os.path.join是伟大的。这就是说,我建议让用户通过文件路径作为绝对路径(在这种情况下,它可以住在机器上的任何地方)或相对路径(在这种情况下,它是相对于当前目录)。我会而不是Downloads/附加到所有的文件路径,因为这明显打破了任何绝对路径,它需要个人调用你的程序来知道它的内部。我认为这是相当于magic number的文件路径。

因此,归结为将filelocation更改为仅仅是文件输入参数本身。

filelocation = sys.argv[1] 

# You can even do some validation if you want 
is not os.path.isfile(filelocation): 
    print "File '%s' does not exist!" % filelocation 

如果你真的想要的是Downloads/文件夹设置为默认值(如果文件路径不是绝对路径),你可以检查,看看是否输入(使用os.path.isabs)绝对路径如果不是,则指定它位于Downloads/目录中。

if not os.path.isabs(filelocation): 
    filelocation = os.path.join('Downloads', filelocation) 

然后用户可以调用两种脚本:

# Loads file in /absolute/path/to/file 
./script.py /absolute/path/to/file ... 

# Loads filename.txt from Downloads/filename.txt 
./script.py filename.txt ... 

此外,它看起来像你可能有你sftp.put输入参数反转。本地文件名应该是第一位的。

2

我想你想filelocation作为stfp.put的第一个参数,因为这应该是本地计算机上的文件名。另外,你可能想在Downloads前面加一个斜线。