从反斜杠到斜杠(创建以数字命名的文件夹)

1 投票
3 回答
6086 浏览
提问于 2025-04-16 09:32

我在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 个回答

1

在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'
1

在字符串中,反斜杠加上某个字符是一个双字符组合,代表其他字符的代码。

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)
3

用os.path来构建你的路径,这样就不管你用什么操作系统,都能避免这些问题。

比如说,你可以这样写:mkdir(os.path.join(r"C:\", "6"))

或者这样:os.path.join(r"D:\", "main", "folder", "red", "34")

撰写回答