【问题标题】:From backslash to slash (to create folders named with number)从反斜杠到斜杠(创建以数字命名的文件夹)
【发布时间】:2011-06-05 00:29:48
【问题描述】:

这两个我有一个很糟糕的问题:Windows 中的“\”和“/”,显然:\

我需要替换 / 中出现的 all \,因此我可以使用 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,但是它们将正斜杠转换为反斜杠。

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

非常感谢你

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

【问题讨论】:

  • 上次我看 '/' 在 Windows 上也能正常工作。无需使用反斜杠

标签: python string mkdir


【解决方案1】:

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

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

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

【讨论】:

  • 不可能,我相信...路径不是手动编写的,也不是那么简单...它们就像“D:\main\folder\red\34”
  • os.path.join("C:", "6") 不起作用。这导致“C:6”。解释在这里:docs.python.org/library/os.path.html#os.path.join.
【解决方案2】:

反斜杠是 Python 字符串文字中的 escape character。要在字符串中实际使用文字反斜杠,您必须使用反斜杠转义反斜杠。

例子:

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 character,而不是数字“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'

【讨论】:

  • 如何使用 os.path.join?路径已经从 os.walk 形成,因为我必须复制文件夹结构..
  • 我不知道我是否理解你的问题。您应该发布代码示例,以便清楚您的问题所在。是您在使用 .replace() 时遇到问题吗?如果是这样,那么在进行字符串替换之前不要将“\”转换为“/”,只需确保转义反斜杠即可。 >>> path_from_walk = "c:\\6" >>> path_from_walk.replace("\\6", "\\foo") 'c:\\foo'
【解决方案3】:

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

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)

【讨论】:

  • mmm...我知道这一切...但是,正如我所说,我不会用键盘写路径....路径来自 os.walk 所以我不能使用 raw ,我不能使用双反斜杠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2013-07-23
  • 1970-01-01
  • 2011-12-31
  • 2010-12-14
相关资源
最近更新 更多