Подтвердить что ты не робот

Как удалить символы плохого пути в Python?

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

Решение

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

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

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

Ответ 1

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

  • Windows:

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

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

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

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

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

Ответ 2

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

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

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

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

In [27]: re.sub('[^\w\-_\. ]', '_', 'some\\*-file._n\\\\ame')
Out[27]: 'some__-file._n__ame'

Ответ 3

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

Ответ 4

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