让 Python 脚本在单独的目录中定位文件
Have Python Script Locate Files in Seperate Directories
我是 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()
首先,如果您正在处理文件路径,建议您使用一些内置功能来构建它们,以确保您有正确的文件分隔符等。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
输入参数。本地文件名应该放在第一位。
我认为您希望 filelocation
作为 stfp.put
的第一个参数,因为它应该是本地计算机上的文件名。另外,您可能想在 Downloads
.
前面加一个斜杠
我是 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()
首先,如果您正在处理文件路径,建议您使用一些内置功能来构建它们,以确保您有正确的文件分隔符等。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
输入参数。本地文件名应该放在第一位。
我认为您希望 filelocation
作为 stfp.put
的第一个参数,因为它应该是本地计算机上的文件名。另外,您可能想在 Downloads
.