2014-05-08 18 views
0

我正在创建一个程序,用于附加用户使用Sox一起选择的音频文件。在Python中添加Windows目录

我最初创建了Linux的程序,但我使它与Windows兼容。在我将文件列表传递给Sox的窗口中时,程序引发'文件名,目录名或卷标语法不正确。'

当我打印出文件列表,它是C:\\\MyProgram\\\等等。我如何使路径中的'\\'变成'\'

我在Windows 8.1上,所以这可能是问题所在。

我曾尝试:

str(nameoffile) 

os.path.abspath(nameoffile) 

os.path.normpath(nameoffile) 

有一个巨大的文件和目录的列表,以便设置每个绝对文件不是一种选择,我使用os.path.join()允许用户浏览文件夹。

但是,当我将文件传递到列表中,然后使用subprocess.list2cmdline(mylist)调用列表时,它只会引发上述错误。

实施例:

mydirectory = os.getcwd() 

appendlist = list() 

appendlist.append("sox") 

for x, i in enumerate(self.fileselected): # A List Of Files The User Selected 

    directory = chosendirectory 

    nextfile = os.path.join(chosendirectory, i) 

    appendlist.append(nextfile) 

subprocess.call([subprocess.list2cmdline(appendlist)], shell=True) 

os.path.join时追加文件....它产生 “C:\\\Program\\\file”,然后它被转换为str()。 str()读取“C:\\\Program\\\file”并且转义字符不会在字符串中注册。我如何删除转义字符作为有效的Windows目录传递给列表?

+0

[this](http://www.diveintopython。net/file_handling/os_module.html)教程可能会对您有所帮助。在Windows中使用路径是PITA,因为''''是时间历史中几乎所有语言中字符串的转义字符。 TL; DR,在字符串文字中,路径分隔符总是会变成'''\''',因为这就是你如何从字符串中得到一个常规的''r'\'''。 – aruisdante

+0

这是有帮助的,但是无论出于何种原因,子进程不喜欢'\\',即使在迭代时它仍然会引发错误。在os模块或其他地方是否有内置的方法来将'\'变成'\'在字符串或列表中? – caleb

+0

查看[this](http://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-in-windows-filenames/)。我的猜测是,执行''os.path.normpath(os.path.abspath(nameoffile))''将完成工作。 – aruisdante

回答

0

如果你改变了当前工作目录的子你可以简化电话:

from subprocess import check_call 

check_call(['sox'] + self.fileselected, cwd=chosendirectory) 

注意:除非你想运行一个内部(shell内建)的命令,比如start你不需要shell=True


反斜杠在源代码Python字符串字面里面特殊的意义。

>>> len('\\') == 1 # a single backslash inside the string 
True 

反斜杠在字符串对象中没有特殊含义(在内存中),即,你不应该在乎反斜线,除非你手动编写的路径在Python源代码 - 如果你从文件中读取路径;你不需要逃避它们。如果你从GUI读取路径;你不需要逃避它们。如果您从子进程的输出读取路径;你不需要逃避它们等。

如果您打印repr(path);它显示了Python字符串文字的外观,即反斜杠加倍(转义)。如果您打印:[path]那么它相当于'['+repr(path)+']'。如果沿着print(path)打印字符串,则不会在字符串对象上调用repr,反斜杠也不会加倍。

对于Windows路径和正则表达式模式,您可以使用不反转反斜杠的原始字符串文字,例如r'C:\Path\n\f' == 'C:\\Path\\n\\f'(注意:r前缀)。