2012-02-10 66 views
2

我正在嘗試使用subprocess.call()在Python腳本中執行$ mv <file> ..。我可以在「普通」文件名上執行此操作,但在某些文件名上不起作用。我無法控制給腳本的文件名。這裏有一個例子:如何在python中使用複雜文件名移動文件

中號的文件名是"ITunes ES Film Metadata_10_LaunchTitles(4th Batch)_08_20_2010.XLS"

當我嘗試直接做命令到Python提示符並拖動文件到它,這就是我得到:

>>> /Users/David/Desktop/itunes_finalize/TheInventionOfLying_CSP/ 
    ITunes\ ES\ Film\ Metadata_10_LaunchTitles\(4th\ Batch\)_08_20_2010.XLS 

No such file or directory 

如何我會在Python腳本中移動這個文件嗎?

更新:

感謝您的答案,這是我最後只是:

for file in glob.glob(os.path.join(dir, '*.[xX][lL][sS]')): 
    shutil.move(file, os.path.join(os.path.dirname(file), os.path.pardir)) 
+2

爲什麼使用'subprocess.call()'而不是'shutil.move'或'os.rename'? – geoffspear 2012-02-10 00:37:10

+0

他可能不知道這件事......我認爲他的問題的基調解決了這種無知。並非所有人都習慣於使用「包含電池」的語言。 ;-) – mvanveen 2012-02-10 00:43:27

回答

4

subprocess不是最好的方法去這裏。例如,如果您使用的是不符合POSIX的操作系統,該怎麼辦?

查看shutil模塊。

>>> import shutil 
>>> shutil.move(src, dest) 

如果發現該文件名的實際字符串是硬,你可以使用glob.glob模式匹配你想要什麼。例如,如果您正在使用.XLS文件從目錄運行腳本/提示符,則可以執行以下操作。

>>> import glob 
>>> glob.glob('*ITunes*.XLS') 

你會得到一個列表以適合該模式的所有文件中的字符串。

4

而不是使用subprocess併產生一個新的進程,使用shutil.move()只是做它蟒蛇。這樣,名稱將不會被重新解釋,並且很少有錯誤發生。

0

Spaces,parens等是shell的問題。如果您不將它們傳遞到shell,它們不需要在Python中轉義。

open('*WOW!* Rock&Roll(uptempo).mp3') 
+2

雖然我認爲這是關於shell的好建議,但它並不直接面對「我將如何着手在python腳本中移動此文件?」的問題。 – mvanveen 2012-02-10 00:43:08