2012-02-10 68 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