От косой черты до косой черты (для создания папок с именами по номерам) - PullRequest
1 голос
/ 07 января 2011

У меня была проблема с этими двумя: "\" и "/" в Windows, очевидно: \

Мне нужно заменить все \ вхождение в /, чтобы я могиспользуйте replace (), потому что, например, не работает с этим "\ 6".

Что мне делать? Я хочу, чтобы "только" использовать mkdir () для репликации структуры папок (без файлов) из одного места в другое.Поэтому я использую в основном os.walk () и mkdir ();все работает хорошо, пока не найдена папка с номером.Infact mkdir может сделать это:

mkdir ("C: \ folder"), а также, например, mkdir ("C: \ newfolder"), но НЕ mkdir ("C: \ 6"), потому что это будет mkdir("C: / 6").

Но я не знаю, как передать ему путь с косой чертой, а не с обратной косой чертой, потому что, как я уже сказал, я не пишу путь вручную, нопроисходят от "dirname" os.walk ().

Я знаю, что существуют os.path.normcase и os.path.normpath, но они преобразуют прямую косую черту в обратную косую черту.

Мне нужно «только» для репликации структуры папок, и, к сожалению, многие папки названы по номеру .... Что я могу сделать?

Большое спасибо

PS: путь не простой, как пример ... более реалистичным примером может быть "D: \ main \ folder \ blue \ sky \ 34"

Ответы [ 3 ]

3 голосов
/ 07 января 2011

создайте свои пути с помощью os.path, тогда это не зависит от платформы, и вы избежите этих проблем.

Например, mkdir(os.path.join(r"C:\", "6"))

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

1 голос
/ 07 января 2011

В строке обратный слэш-что-то - это орграф, код символа для чего-то еще.

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)
1 голос
/ 07 января 2011

Обратная косая черта - это escape-символ в строковых литералах 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! See 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'
...