Как удалить неправильные символы пути в Python? - PullRequest
25 голосов
/ 23 июня 2009

Какой самый кроссплатформенный способ удаления неверных символов пути (например, "\" или ":" в Windows) в Python?

Решение

Поскольку, похоже, идеального решения не существует, я решил быть относительно ограничительным и использовал следующий код:

def remove(value, deletechars):
    for c in deletechars:
        value = value.replace(c,'')
    return value;

print remove(filename, '\/:*?"<>|')

Ответы [ 4 ]

17 голосов
/ 28 ноября 2012

Я думаю, что самый безопасный подход - заменить подозрительных персонажей. Итак, я думаю, что вы можете просто заменить (или избавиться) все, что не является буквенно-цифровым, -, _, пробел или точку. И вот как вы это делаете:

import re
re.sub('[^\w\-_\. ]', '_', filename)

Приведенное выше экранирует каждый символ, который не является буквой '_', '-', '.' или пробелом с '_'. Поэтому, если вы просматриваете весь путь, вам также нужно добавить os.sep в список разрешенных символов.

Вот пример вывода:

In [27]: re.sub('[^\w\-_\. ]', '_', 'some\\*-file._n\\\\ame')
Out[27]: 'some__-file._n__ame'
16 голосов
/ 23 июня 2009

К сожалению, набор допустимых символов зависит от ОС и от файловой системы.

  • Windows

    • Используйте почти любой символ в текущей кодовой странице для имени, включая символы Юникода и символы в расширенном наборе символов (128–255), за исключением следующего:
      • Следующие зарезервированные символы недопустимы:
        <>: "/ \ |? *
      • Символы, чьи целочисленные представления находятся в диапазоне от нуля до 31, не допускаются.
      • Любой другой символ, который не разрешен целевой файловой системой.

    Список принятых символов может варьироваться в зависимости от ОС и локали компьютера, который первым отформатировал файловую систему.

    .NET имеет GetInvalidFileNameChars и GetInvalidPathChars , но я не знаю, как вызвать их из Python.

  • Mac OS: NUL всегда исключается, "/" исключается из уровня POSIX, ":" исключается из API Apple
    • HFS +: любая последовательность неисключенных символов, представимая UTF-16 в спецификации Unicode 2.0
    • HFS: любая последовательность неисключенных символов, представляемых в MacRoman (по умолчанию) или других кодировках, в зависимости от компьютера, на котором была создана файловая система
    • UFS: так же, как HFS +
  • Linux:
    • родные (UNIX-подобные) файловые системы: любая последовательность байтов, кроме NUL и "/"
    • FAT, NTFS, другие несобственные файловые системы: различаются

Лучше всего, возможно, либо быть чрезмерно консервативным на всех платформах, либо просто попытаться создать имя файла и обработать ошибки.

1 голос
/ 23 июня 2009

Если вы используете python, попробуйте os.path , чтобы избежать межплатформенных проблем с путями.

0 голосов
/ 23 июня 2009

Этот символ находится в os.sep, это будет "\" или ":", в зависимости от того, в какой системе вы находитесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...