设置:Windows 7
Python版本:3.3
我正在创建一个跨平台应用程序,我让用户使用Tkinter的askdirectory()
模块中的tkinter.filedalog.askdirectory
方法提供目录。这工作正常,除了Windows上的某些原因它给了我正斜杠。
Windows使用反斜杠,而不是正斜杠,因此当我尝试使用本机文件斜杠保存文本文件时(配置文件存储目录,因此它有一个我必须添加的结尾斜杠),它看起来很傻:
F:/Pictures/Wallpapers\
我用来放置原生斜杠的代码只是os.sep
,它是当前系统的本机目录分隔符,在* nix和windows上是不同的。
def getDownloadPath(self):
pathdir=askdirectory()
if pathdir=='':
return #cancel
pathdir+=os.sep
self.download_location.delete(0,END)
self.download_location.insert(0,pathdir)
文件夹选择器没有返回原生斜杠的原因吗?我用Google搜索,没有找到答案。
答案 0 :(得分:2)
修改强>
我要编辑我的答案,因为我认为我不是很清楚。
首先,tkinter.filedialog.askdirectory
始终在其返回的路径中使用forwardslashes。所以,你所看到的不是一个错误 - 它是功能设计方式的结果。此外,Windows和* nix系统上都会出现此问题。
现在,似乎没有任何东西可以直接说明为什么askdirectory
以这种方式构建。 Tkinter总是因为记录不佳而闻名。 ;)
但是,有几件事需要考虑:
\
是Python字符串中的特殊字符。它会创建一个escape sequence。因此,如果askdirectory
返回的路径包含反斜杠,则只会导致它出现问题。或者,如果没有,您仍然需要一些安全代码来防止它们。
Python在Windows和* nix系统上运行良好,路径中有forwardslashes。例如,这段代码:
open("C:/path/path/")
与此完全相同:
open(r"C:\path\path")
唯一的区别是,使用第二种方法,您必须处理转义序列。我通过使用原始字符串来完成此操作,在上面的链接中对此进行了解释。但是,使用forwards的方法要容易得多。
由于Tkinter是跨平台的,因此在内部使用规范化路径构造既方便又高效。因此,为什么不在没有必要转义的情况下使用适用于Windows和* nix系统的那个?
如果必须具有应用程序的本机路径,Python已经具有内置函数来实现它。这些可以在os.path
模块中找到。
考虑到这些原因,构建askdirectory
以使用转发符号似乎是合乎逻辑的。
答案 1 :(得分:1)
Windows(NT)实际上支持使用正斜杠定义的路径。 甚至可能有区分大小写的文件名。 请参阅WinAPI CreateFile - FILE_FLAG_POSIX_SEMANTICS。它在NTFS上受支持。
http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx