2016-03-08 74 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前面加一個斜線。