让Python脚本在单独的目录中找到文件

时间:2016-03-08 21:48:27

标签: python linux ftp sftp

我对python编程很陌生,我编写了一个脚本来自动将文件通过SFTP上传到远程机器。该脚本运行得非常好,但是有一个我似乎无法弄清楚的问题。如果我在我试图上传的文件所在的目录中,一切都很顺利。但是,当我输入不在所述目录中的文件名时,它不喜欢这样。每次都要浏览不同的文件夹是一件麻烦事。我知道我可以将这些文件整合到一个文件夹中...但我很想尝试自动化这个文件。

/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 个答案:

答案 0 :(得分: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输入参数反转。应该首先使用本地文件名。

答案 1 :(得分:2)

我认为你希望filelocation作为stfp.put的第一个参数,因为它应该是本地机器上的文件名。此外,您可能希望在Downloads前面加斜杠。