Превратить строку в правильное имя файла? - PullRequest
255 голосов
/ 17 ноября 2008

У меня есть строка, которую я хочу использовать в качестве имени файла, поэтому я хочу удалить все символы, которые не допускаются в именах файлов, используя Python.

Я бы предпочел быть строгим, чем иначе, поэтому допустим, что я хочу сохранить только буквы, цифры и небольшой набор других символов, таких как "_-.() ". Какое самое элегантное решение?

Имя файла должно быть действительным в нескольких операционных системах (Windows, Linux и Mac OS) - это файл MP3 в моей библиотеке с названием песни в качестве имени файла, который используется и копируется на 3 машины.

Ответы [ 22 ]

0 голосов
/ 05 мая 2012

Я уверен, что это не очень хороший ответ, так как он изменяет зацикленную строку, но, похоже, работает нормально:

import string
for chr in your_string:
 if chr == ' ':
   your_string = your_string.replace(' ', '_')
 elif chr not in string.ascii_letters or chr not in string.digits:
    your_string = your_string.replace(chr, '')
0 голосов
/ 10 июля 2009

UPDATE

Все ссылки неработоспособны в этом 6-летнем ответе.

Кроме того, я бы больше так не делал, просто base64 кодировал или отбрасывал небезопасные символы. Пример Python 3:

import re
t = re.compile("[a-zA-Z0-9.,_-]")
unsafe = "abc∂éåß®∆˚˙©¬ñ√ƒµ©∆∫ø"
safe = [ch for ch in unsafe if t.match(ch)]
# => 'abc'

С помощью base64 вы можете кодировать и декодировать, чтобы вы могли снова получить исходное имя файла.

Но в зависимости от варианта использования вам может быть лучше создать случайное имя файла и сохранить метаданные в отдельном файле или БД.

from random import choice
from string import ascii_lowercase, ascii_uppercase, digits
allowed_chr = ascii_lowercase + ascii_uppercase + digits

safe = ''.join([choice(allowed_chr) for _ in range(16)])
# => 'CYQ4JDKE9JfcRzAZ'

ОРИГИНАЛЬНЫЙ LINKROTTEN ОТВЕТ :

Проект bobcat содержит модуль python, который делает именно это.

Это не совсем надежно, см. сообщение и ответ .

Итак, как уже отмечалось: base64 кодирование, вероятно, является лучшей идеей, если читаемость не имеет значения.

...