从反斜杠到斜杠(创建以数字命名的文件夹)
我在Windows系统中遇到了一个麻烦,就是反斜杠“\”和正斜杠“/”的问题,真让人头疼。
我需要把所有的反斜杠“\”替换成正斜杠“/”,这样我就可以使用replace()函数了,因为像“\6”这样的情况是无法处理的。
我该怎么做呢?我只想用mkdir()来复制一个文件夹的结构(不包括文件),从一个地方到另一个地方。所以我主要使用os.walk()和mkdir();一切都很顺利,直到我遇到一个名字是数字的文件夹。实际上,mkdir可以这样使用:
mkdir("C:\folder"),也可以mkdir("C:\newfolder"),但像mkdir("C:\6")这样的就不行,因为它会变成mkdir("C:/6")。
但我不知道怎么把路径中的反斜杠换成正斜杠,因为正如我所说的,我并不是手动写路径,而是从os.walk()的“dirname”中获取的。
我知道有os.path.normcase和os.path.normpath这两个函数,但它们会把正斜杠转换成反斜杠。
我只需要复制一个文件夹的结构,而不幸的是,很多文件夹的名字都是数字……我该怎么办呢?
非常感谢!
附注:路径并不像例子那么简单……一个更真实的例子可能是"D:\main\folder\blue\sky\34"
3 个回答
在Python的字符串中,反斜杠(\)是一个叫做“转义字符”的东西。简单来说,如果你想在字符串里用一个实际的反斜杠,就得用两个反斜杠来表示。
举个例子:
foo = "c:\\bar"
你在用数字的文件夹名称时遇到的问题是,Python会把一个反斜杠后面跟着的有效八进制数字当成一个字符,这个字符的编码就是那个八进制数字。你可以查看这个链接了解更多:http://docs.python.org/reference/lexical_analysis.html#string-literals。
来看看“c:\6”这个例子:
>>> len("c:\6")
3
>>> len("c:\\6")
4
字符编码6代表的是一个“ACK字符”,而不是我们平常看到的数字“6”。
你应该还是使用os.path.join()来构建你用来创建文件夹的路径。Python会自动处理不同平台下的斜杠问题(除了驱动器字母...真让人头疼!更多信息可以看这里:http://docs.python.org/library/os.path.html#os.path.join)。
举个例子:
>>> os.path.join("D:\\", "main", "folder", "blue", "sky", "34")
'D:\\main\\folder\\blue\\sky\\34'
在字符串中,反斜杠加上某个字符是一个双字符组合,代表其他字符的代码。
mkdir('c:\newfolder')
这个操作失败了,因为'\n'是一个换行符 - 你告诉电脑创建一个名为'c:{换行}ewfolder'的新文件夹,这个名字是不合法的。
要让它正常工作,你需要做以下其中之一
mkdir(r'c:\newfolder') # the preceding r makes the string raw,
# so digraphs are not processed
mkdir('c:\\newfolder') # \\ is the digraph for a single backslash
.
补充:试试这个;你遇到什么问题了吗?
import os
def dupTree(src, dest):
src = os.path.abspath(src)
dest = os.path.abspath(dest)
for root,dirs,files in os.walk(src):
relPath = os.path.relpath(root,src)
for d in dirs:
newDir = os.path.normpath(os.path.join(dest, relPath, d))
os.mkdir(newDir)
用os.path来构建你的路径,这样就不管你用什么操作系统,都能避免这些问题。
比如说,你可以这样写:mkdir(os.path.join(r"C:\", "6"))
或者这样:os.path.join(r"D:\", "main", "folder", "red", "34")