2015-09-04 5 views
1

Чтобы защитить загруженные имена изображений, я хотел бы удалить файлы изображений из всего, кроме string.ascii_letters, string.digits, точки и (одного) пробела.В Python как белый список определенных символов в имени файла?

Так что мне интересно, какой лучший способ проверить текст против других персонажей?

+1

так (один) пробельные является обязательным в имени файла? –

+1

Посмотрите на это [ответ] (http://stackoverflow.com/questions/29998052/deleting-consonants-from-a-string-in-python/29998062#29998062), который имеет около 8 различных способов проверки и удаление определенных символов. –

+0

@PruthviRaj, ну просто, чтобы избежать грязных имен, да. – Jand

ответ

2
import re 
import os 
s = 'asodgnasAIDID12313%*(@&(!$ 1231' 
result = re.sub('[^a-zA-Z\d\. ]|(){2,}','',s) 
if result =='' or os.path.splitext(result)[0].isspace(): 
    print "not a valid name" 
else: 
    print "valid name" 

EDIT:

изменил его так будет и белый список только один пробел + добавлен импорт повторно

+0

Очень кратким. Чтобы завершить ответ, просто добавьте 'import re'. Благодаря! – Jand

+0

Вы правы, я только что добавил – DorElias

+0

Извините, я просто нашел оговорку. Если вы выберете имя файла utf8 с несколькими пробелами, последнее имя будет чем-то вроде '' '', которое нежелательно. Есть идеи об этом? – Jand

1

Не уверен, если это то, что вам нужно, но дать ему попробовать:

import sys, os 

fileName, fileExtension = os.path.splitext('image 11%%22.jpg') 
fileExtension = fileExtension.encode('ascii', 'ignore') 
fileName = fileName.encode('ascii', 'ignore') 
if fileExtension[1:] in ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tga']: 
    fileName = ''.join(e for e in fileName if e.isalnum()) 
    print fileName+fileExtension 
    #image1122.jpg 
else: 
    print "Extension not supported" 

isalnum() 

https://docs.python.org/2/library/stdtypes.html#str.isalnum

+0

Ну, он возвращает '.jpg, когда имя файла не ascii , – Jand

+0

Вы можете 'ascii' кодировать' fileExtension' и 'fileName' с' fileExtension.encode ('ascii', 'ignore') 'перед проверкой. –

0

Я не буду использовать регулярное выражение для этого. Единственное сложное требование - это простое пространство, но это тоже можно сделать.

import string 

whitelist = set(string.ascii_letters + string.digits) 
good_filename = "herearesomelettersand123numbers andonespace" 
bad_filename = "symbols&#! and more than one space" 

def strip_filename(fname, whitelist): 
    """Strips a filename 

    Removes any character from string `fname` and removes all but one 
    whitespace. 
    """ 

    whitelist.add(" ") 

    stripped = ''.join([ch for ch in fname if ch in whitelist]) 
    split = stripped.split() 
    result = " ".join([split[0], ''.join(split[1:])]) 
    return result 

Затем вызовите его:

good_sanitized = strip_filename(good_filename, whitelist) 
bad_sanitized = strip_filename(bad_filename, whitelist) 
print(good_sanitized) 
# 'herearesomelettersand123numbers andonespace' 
print(bad_sanitized) 
# 'symbols andmorethanonespace' 
+0

удалите дублированный ответ – Jand

+0

Да для обоих. Net работает немного, и я должен был обновить POST, я думаю. Удалил обман. –

+0

Ну, это не подходит для имен файлов, отличных от ascii. Возьмите '' 些 些 .jpg''. Ваш метод возвращает '' jpg ''. – Jand

Смежные вопросы