1

我对这两个有一个不好的问题:Windows中的“\”和“/”,显然:\

我需要替换/ 中出现的所有\,因此我可以使用 replace(),因为例如不适用于此“\6”。

我必须做什么?我希望“仅”使用 mkdir()将文件夹结构(无文件)从一个位置复制到另一个位置。所以我主要使用 os.walk() 和 mkdir(); 一切正常,直到找到一个以数字命名的文件夹。事实上 mkdir 可以做到这一点:

例如 mkdir("C:\folder") 和 mkdir("C:\newfolder") 但不是 mkdir("C:\6"),因为它会 mkdir("C:/6")。

但是我不知道如何给它传递一个带有斜杠而不是反斜杠的路径,因为正如我所说,我不手动编写路径,而是来自 os.walk() 的“目录名”。

我知道存在 os.path.normcase 和 os.path.normpath,但它们将正斜杠转换为反斜杠。

我需要“仅”来复制文件夹结构,不幸的是,许多文件夹都以数字命名......我该怎么办?

非常感谢您

PS:路径并不像示例那样简单...更现实的示例可能是“D:\ main\folder\blue\sky\34”

4

3 回答 3

3

使用 os.path 构建您的路径,然后它与平台无关,您将避免这些问题。

例如,mkdir(os.path.join(r"C:\", "6"))

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

于 2011-01-07T00:31:14.027 回答
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() 来构造与 mkdir 一起使用的路径。Python 将处理依赖于平台的斜杠行为(驱动器号除外...grr!请参阅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'
于 2011-01-07T01:02:49.440 回答
1

在字符串中,反斜杠是一个有向图,是其他东西的字符代码。

mkdir('c:\newfolder')

失败,因为 '\n' 是换行符 - 您已告诉您的计算机创建一个名为 'c:{newline}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)
于 2011-01-07T01:03:56.727 回答