문자열을 유효한 파일 이름으로 바꾸시겠습니까?


298

파일 이름으로 사용하려는 문자열이 있으므로 Python을 사용하여 파일 이름에 허용되지 않는 모든 문자를 제거하고 싶습니다.

다른 방법보다 엄격하기 때문에 문자, 숫자 및와 같은 작은 다른 문자 집합 만 유지하고 싶다고 가정 해 봅시다 "_-.() ". 가장 우아한 솔루션은 무엇입니까?

파일 이름은 여러 운영 체제 (Windows, Linux 및 Mac OS)에서 유효해야합니다. 파일 이름이 노래 제목 인 내 라이브러리의 MP3 파일이며 3 대의 컴퓨터간에 공유 및 백업됩니다.


17
이것이 os.path 모듈에 내장되어서는 안됩니까?
endolith

2
아마도 유스 케이스 에는 현재 경로 뿐만 아니라 모든 플랫폼 에서 안전한 단일 경로가 필요하지만 이는 os.path가 처리하도록 설계되지 않은 것입니다.
javawizard 2016 년

2
위의 주석을 확장하려면 현재 디자인은 os.pathos에 따라 다른 라이브러리 를 실제로로드합니다 ( 문서 의 두 번째 참고 참조 ). 따라서 인용 기능이 구현 된 os.path경우 POSIX 시스템에서 실행할 때 POSIX 안전 또는 Windows에서 실행할 때 Windows 안전에 대한 문자열 만 인용 할 수 있습니다. 결과 파일 이름은 창과 POSIX에서 반드시 유효하지는 않습니다. 이는 질문이 요구하는 것입니다.
dshepherd

답변:


164

Django 프레임 워크 에서 임의의 텍스트로 "슬러그"를 만드는 방법을 살펴볼 수 있습니다 . 슬러그는 URL 및 파일 이름 친화적입니다.

Django 텍스트 유틸리티는 함수를 정의합니다. slugify()아마도 이런 종류의 표준 일 것입니다. 기본적으로 코드는 다음과 같습니다.

def slugify(value):
    """
    Normalizes string, converts to lowercase, removes non-alpha characters,
    and converts spaces to hyphens.
    """
    import unicodedata
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
    value = unicode(re.sub('[-\s]+', '-', value))
    # ...
    return value

더 많은 것이 있지만, 제련을 다루지 않고 탈출하기 때문에 제외했습니다.


11
마지막 줄은 다음과 같아야합니다 : value = unicode (re.sub ( '[-\ s] +', '-', value))
Joseph Turian

1
고마워-뭔가를 놓칠 수는 있지만 "normalize () argument 2는 str이 아닌 유니 코드 여야합니다"
Alex Cook

"normalize () 인수 2". 를 의미합니다 value. 값이 유니 코드 여야하는 경우 실제로 유니 코드인지 확인해야합니다. 또는. 실제 값이 실제로 ASCII 문자열 인 경우 유니 코드 정규화를 생략 할 수 있습니다.
S.Lott

8
이 접근법의 긍정적 인면을 알지 못하는 사람은 알파벳이 아닌 문자를 제거하는 것이 아니라 먼저 NFKD 정규화를 통해 좋은 대체 문자를 찾으려고 시도하므로 é는 e가되고 위첨자는 1이됩니다. (1) 정상 등 감사합니다
마이클 스캇 커스버트

48
slugify기능은 이동되었습니다에 장고 / 유틸 / text.py , 해당 파일도 포함 get_valid_filename기능을.
Denilson Sá Maia

104

이 화이트리스트 방식 (즉, valid_chars에있는 문자 만 허용)은 파일 형식이나 ".."와 같이 잘못된 유효한 문자 조합 (예 : "..")에 제한이없는 경우 작동합니다. Windows에서 유효하지 않다고 생각되는 ".txt"라는 파일 이름을 허용합니다. 이것이 가장 간단한 접근법이므로 valid_chars에서 공백을 제거하고 오류가 발생하는 경우 알려진 유효한 문자열을 추가하려고 시도하므로 다른 접근법은 Windows 파일 명명 제한 에 대처할 수있는 위치에 대해 알아야 하므로 따라서 훨씬 더 복잡합니다.

>>> import string
>>> valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
>>> valid_chars
'-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
>>> filename = "This Is a (valid) - filename%$&$ .txt"
>>> ''.join(c for c in filename if c in valid_chars)
'This Is a (valid) - filename .txt'

7
valid_chars = frozenset(valid_chars)아프지 않을 것입니다. allchars에 적용하면 1.5 배 빠릅니다.
jfs

2
경고 : 두 개의 다른 문자열을 동일한 문자열 >>> import string >>> valid_chars = "- . () % s % s"% (string.ascii_letters, string.digits) >>> valid_chars '- . ()에 매핑 합니다. abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '>>> filename = "a.com/hello/world">>>' '.join (c가 valid_chars의 c 인 경우 파일 이름 c는 c)'a.comhelloworld '>>> filename = "a.com/helloworld ">>> ''.join (c는 valid_chars의 경우 c에서 c의 c) 'a.comhelloworld'>>>
robert king

3
말할 것도없이 "CON"Windows 에서 파일 이름을 지정하면 문제가
발생할

2
약간의 재 배열은 대체 문자를 간단하게 지정합니다. 먼저 원래 기능 : ''.join (c는 valid_chars의 경우 c이면 ''는 c이고 파일 이름은 c) 또는 모든 유효하지 않은 문자에 대한 대체 문자 또는 문자열 : ''.join (c는 valid_chars의 경우 c는 '.' c in filename)
PeterVermont

101

문자열 메서드와 함께 목록 이해를 사용할 수 있습니다.

>>> s
'foo-bar#baz?qux@127/\\9]'
>>> "".join(x for x in s if x.isalnum())
'foobarbazqux1279'

3
대괄호는 생략 할 수 있습니다. 이 경우 생성기 표현식 이 조인으로 전달되어 사용되지 않는 목록을 작성하는 단계를 저장합니다.
Oben Sonne

31
+1 이것을 좋아했습니다. 내가 한 약간의 수정 : "".join ([x in s]에 대해 x.isalnum () 그렇지 않으면 "_"인 경우 x)-빈 칸처럼 유효하지 않은 항목이 _ 인 결과가 나타납니다. 어쩌면 다른 사람을 테프 럴 수도 있습니다.
Eddie Parker

12
이 솔루션은 훌륭합니다! 나는 약간의 수정을했다 :filename = "".join(i for i in s if i not in "\/:*?<>|")
Alex Krycek

1
불행히도 공백과 점을 허용하지 않지만 아이디어가 마음에 듭니다.
tiktak

9
@tiktak : to (또한) 공백, 점 및 밑줄을 허용"".join( x for x in s if (x.isalnum() or x in "._- "))
hardmooth

95

문자열을 파일 이름으로 사용하는 이유는 무엇입니까? 사람의 가독성이 중요하지 않은 경우 파일 시스템 안전 문자열을 생성 할 수있는 base64 모듈을 사용합니다. 읽을 수는 없지만 충돌을 처리 할 필요가 없으며 가역적입니다.

import base64
file_name_string = base64.urlsafe_b64encode(your_string)

업데이트 : Matthew의 의견에 따라 변경되었습니다.


1
그렇다면 이것이 가장 좋은 대답입니다.
user32141

60
경고! 기본적으로 base64 인코딩은 "/"문자를 유효한 출력으로 포함하며 많은 시스템의 파일 이름에는 유효하지 않습니다. 대신 base64.urlsafe_b64encode (your_string)
Matthew

15
실제로 사람의 가독성은 디버깅 목적으로 만하더라도 거의 항상 요소입니다.
static_rtti

5
파이썬 3에서는 your_string바이트 배열이거나 이것의 결과 encode('ascii')가 작동해야합니다.
누 메논

4
def url2filename(url): url = url.encode('UTF-8') return base64.urlsafe_b64encode(url).decode('UTF-8') def filename2url(f): return base64.urlsafe_b64decode(f).decode('UTF-8')
JeffProd

40

더 복잡하게 만들기 위해 잘못된 문자를 제거하여 유효한 파일 이름을 얻을 수는 없습니다. 허용되는 문자는 파일 이름이 다르기 때문에 보수적 인 접근 방식으로 인해 유효한 이름을 잘못된 이름으로 바꿀 수 있습니다. 다음과 같은 경우에 특별한 처리를 추가 할 수 있습니다.

  • 문자열은 모두 유효하지 않은 문자입니다 (빈 문자열로 남겨 두십시오)

  • "."와 같은 특별한 의미의 문자열로 끝납니다. 또는 ".."

  • Windows에서는 특정 장치 이름 이 예약되어 있습니다. 예를 들어 "nul", "nul.txt"(또는 실제로 nul.anything)라는 파일을 만들 수 없습니다. 예약 된 이름은 다음과 같습니다.

    CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 및 LPT9

파일 이름 앞에 문자열을 추가하여 이러한 경우 중 하나를 초래할 수 없으며 유효하지 않은 문자를 제거하여 이러한 문제를 해결할 수 있습니다.


24

Github에는 python-slugify 라는 멋진 프로젝트가 있습니다 .

설치:

pip install python-slugify

그런 다음 사용하십시오.

>>> from slugify import slugify
>>> txt = "This\ is/ a%#$ test ---"
>>> slugify(txt)
'this-is-a-test'

2
나는이 도서관을 좋아하지만 생각했던 것만 큼 좋지는 않다. 초기 테스트는 가능하지만 도트도 변환합니다. 그래서 test.txt얻는다 test-txt너무 많이이다.
therealmarv

23

S.Lott 가 대답 한 것처럼 Django Framework 에서 문자열을 유효한 파일 이름으로 변환하는 방법을 볼 수 있습니다 .

최신 및 업데이트 된 버전은 utils / text.py에 있으며 "get_valid_filename"을 정의합니다.

def get_valid_filename(s):
    s = str(s).strip().replace(' ', '_')
    return re.sub(r'(?u)[^-\w.]', '', s)

( https://github.com/django/django/blob/master/django/utils/text.py 참조 )


4
django에 이미 게으른 사람을 위해 :django.utils.text import get_valid_filename
theannouncer

2
정규식에 익숙하지 않은 경우 re.sub(r'(?u)[^-\w.]', '', s)밑줄 ( '_')이 아닌 숫자 (0-9)가 아닌 문자가 아닌 마침표 ( '-')가 아닌 마침표 ( '.')가 아닌 모든 문자를 제거합니다. ). 여기 "문자"에는 漢語와 같은 모든 유니 코드 문자가 포함됩니다.
cowlinator

3
길이를 확인하고 싶을 수도 있습니다. 파일 이름은 255 자로 제한됩니다 (또는 FS에 따라 32 자)
Matthias Winkelmann

19

이것이 내가 궁극적으로 사용한 솔루션입니다.

import unicodedata

validFilenameChars = "-_.() %s%s" % (string.ascii_letters, string.digits)

def removeDisallowedFilenameChars(filename):
    cleanedFilename = unicodedata.normalize('NFKD', filename).encode('ASCII', 'ignore')
    return ''.join(c for c in cleanedFilename if c in validFilenameChars)

unicodedata.normalize 호출은 악센트 부호가있는 문자를 액센트가없는 문자로 대체하므로 단순히 문자를 제거하는 것보다 낫습니다. 그런 다음 허용되지 않는 모든 문자가 제거됩니다.

내 솔루션은 허용되지 않는 파일 이름을 피하기 위해 알려진 문자열을 추가하지 않습니다. 파일 이름 형식이 주어지면 파일 이름을 찾을 수 없기 때문입니다. 보다 일반적인 해결책이 필요합니다.


고유 한 접두사로 uuid.uuid4 ()를 사용할 수 있어야합니다
slf

6
낙타 사건 .. 아
치매 고슴도치

파이썬 3.6에서 작동하도록 편집 / 업데이트 할 수 있습니까?
Wavesailor

13

유닉스 시스템 이외의 파일 이름에는 실제로 제한이 없습니다.

  • \ 0을 포함하지 않을 수 있습니다
  • /를 포함하지 않을 수 있습니다

다른 모든 것은 공정한 게임입니다.

$ 터치 "
> 심지어 여러 줄
> 하하
> ^ [[31m 빨강 ^ [[0m
> 악 "
$ ls -la 
-rw-r--r-- 0 11 월 17 일 23:39? 심지어 여러 줄? haha ​​?? [31m 빨강? [0m? 사악한
$ ls -lab
-rw-r--r-- 0 11 월 17 일 23:39 \ neven \ 여러 줄 \ nhaha \ n \ 033 [31m \ red \\ 033 [0m \ nevil
$ perl -e '내 $ i (glob (q {./* even *})) {print $ i; } '
./
심지어 여러 줄
ㅋ
 빨간 
악

예, 방금 ANSI 색상 코드를 파일 이름으로 저장하고 적용했습니다.

엔터테인먼트를 위해 BEL 캐릭터를 디렉토리 이름에 넣고 CD에 넣을 때 나오는 재미를보십시오.)


OP는 "파일 이름은 여러 운영 체제에서 유효해야합니다"
cowlinator

1
내 답변을 게시 한 후 10 시간 후에 설명이 추가되었다는 @cowlinator :) OP의 편집 로그를 확인하십시오.
Kent Fredric

12

한 줄로 :

valid_file_name = re.sub('[^\w_.)( -]', '', any_string)

'_'문자를 넣어 더 읽기 쉽게 만들 수도 있습니다 (예 : 슬래시를 교체하는 경우).


7

re.sub () 메소드를 사용하여 "filelike"가 아닌 것을 대체 할 수 있습니다. 그러나 사실상 모든 인물이 유효 할 수 있습니다. 그래서 미리 완성 된 기능 (믿습니다)이 없습니다.

import re

str = "File!name?.txt"
f = open(os.path.join("/tmp", re.sub('[^-a-zA-Z0-9_.() ]+', '', str))

/tmp/filename.txt에 파일 핸들이 생깁니다.


5
그룹 매처에서 대시를 먼저 이동해야 범위로 표시되지 않습니다. re.sub ( '[^
-a

7
>>> import string
>>> safechars = bytearray(('_-.()' + string.digits + string.ascii_letters).encode())
>>> allchars = bytearray(range(0x100))
>>> deletechars = bytearray(set(allchars) - set(safechars))
>>> filename = u'#ab\xa0c.$%.txt'
>>> safe_filename = filename.encode('ascii', 'ignore').translate(None, deletechars).decode()
>>> safe_filename
'abc..txt'

빈 문자열, 특수 파일 이름 ( 'nul', 'con'등)은 처리하지 않습니다.


변환 표의 경우 +1, 가장 효율적인 방법입니다. 특수한 파일 이름 / 빈 공간의 경우 간단한 사전 조건 확인으로 충분하며 외부의 간단한 교정도 가능합니다.
Christian Witts

1
변환은 정규 표현식보다 약간 더 효율적이지만 실제로 파일을 열려고하면 그 시간이 줄어들 것입니다. 따라서 나는 위의 혼란보다 더 읽을 수있는 정규 표현식 솔루션을 선호
nosatalian

또한 블랙리스트가 걱정됩니다. 물론, 화이트리스트를 기반으로하는 블랙리스트이지만 여전히 그렇습니다. 안전하지 않은 것 같습니다. "allchars"가 실제로 완전한지 어떻게 알 수 있습니까?
isaaclw

@isaaclw : '.translate ()'은 256 자 문자열을 변환 표 (바이트-바이트 변환)로 허용합니다. '.maketrans ()'는 그러한 문자열을 만듭니다. 모든 값이 적용됩니다. 순수한 화이트리스트 방식입니다
jfs

파일 이름 '.'은 어떻습니까? (단일 점). 현재 디렉토리가 그 이름을 사용하고 있기 때문에 유닉스에서는 작동하지 않습니다.
Finn Årup Nielsen

6

조심해야하지만. 라틴어 만보고 있다면 인트로에 명확하게 언급되어 있지 않습니다. ASCII 문자로만 소독하면 일부 단어는 의미가 없거나 다른 의미가 될 수 있습니다.

당신이 "Forêt poésie"(산림시)를 가지고 있다고 상상해 봅시다.

한자를 다루어야한다면 더 나쁘다.

"下 北 沢"시스템은 결국 "---"를 수행 할 수 있습니다. 따라서 파일 만 다루는 경우 파일을 제어하는 ​​일반 체인이라고하거나 문자를 그대로 유지하는 것이 좋습니다. URI의 경우 거의 같습니다.


6

try / except로 "osopen"을 감싸고 기본 OS가 파일이 유효한지 여부를 정렬하도록 하시겠습니까?

이것은 훨씬 적은 작업처럼 보이고 어떤 OS를 사용하든 유효합니다.


5
그래도 이름이 유효합니까? OS가 만족스럽지 않다면 여전히 무언가를해야합니까?
jeromej

1
경우에 따라 OS / 언어가 파일 이름을 다른 형식으로 자동으로 변경시킬 수 있지만 디렉토리 목록을 작성하면 다른 이름이 표시됩니다. 그리고 이것은 "파일을 거기에 쓸 때 파일을 찾을 때 다른 것"이라는 문제로 이어질 수 있습니다. (나는 VAX에 대해 들어 본 행동에 대해 이야기하고 있습니다 ...)
Kent Fredric

또한 "파일 이름은 여러 운영 체제에서 유효해야합니다." osopen는 한 시스템 에서 실행중인 파일을 탐지 할 수 없습니다 .
LarsH 2016 년

5

다른 주석이 아직 해결하지 않은 또 다른 문제는 빈 문자열이며, 이는 유효한 파일 이름이 아닙니다. 너무 많은 문자를 제거하여 빈 문자열로 끝날 수도 있습니다.

Windows에서 예약 한 파일 이름과 점 문제는 무엇입니까? "임의의 사용자 입력에서 유효한 파일 이름을 어떻게 정규화합니까?"라는 질문에 대한 가장 안전한 대답은 무엇입니까? "도 귀찮게하지 마십시오": 피할 수있는 다른 방법을 찾을 수 있다면 (예 : 데이터베이스의 정수 기본 키를 파일 이름으로 사용) 그렇게하십시오.

필요한 경우 공백과 '.'을 정말로 허용해야합니다. 이름의 일부인 파일 확장자의 경우 다음과 같이 시도하십시오.

import re
badchars= re.compile(r'[^A-Za-z0-9_. ]+|^\.|\.$|^ | $|^$')
badnames= re.compile(r'(aux|com[1-9]|con|lpt[1-9]|prn)(\.|$)')

def makeName(s):
    name= badchars.sub('_', s)
    if badnames.match(name):
        name= '_'+name
    return name

RISC OS는 공백을 싫어하고 '.'를 사용하는 등 예기치 않은 OS에서 특히이를 보장 할 수는 없습니다. 디렉토리 구분자로.


4

나는 python-slugify 접근법을 좋아했지만 도트를 벗겨 내고 싶지 않았습니다. 그래서 깨끗한 파일 이름을 s3에 다음과 같이 업로드하도록 최적화했습니다.

pip install python-slugify

예제 코드 :

s = 'Very / Unsafe / file\nname hähä \n\r .txt'
clean_basename = slugify(os.path.splitext(s)[0])
clean_extension = slugify(os.path.splitext(s)[1][1:])
if clean_extension:
    clean_filename = '{}.{}'.format(clean_basename, clean_extension)
elif clean_basename:
    clean_filename = clean_basename
else:
    clean_filename = 'none' # only unclean characters

산출:

>>> clean_filename
'very-unsafe-file-name-haha.txt'

이것은 안전 장치이므로 확장명이없는 파일 이름으로 작동하며 안전하지 않은 문자 파일 이름에서만 작동합니다 (결과는 none여기에 있음).


1
나는 이것을 좋아하고, 바퀴를 재발 명하지 말고, 필요하다면 전체 장고 프레임 워크를 가져 오지 말고, 나중에 코드를 유지하지 않을 경우 직접 코드를 붙여 넣지 말고 문자열 시도를 생성하십시오. 비슷한 문자를 안전한 문자와 일치시키기 때문에 새로운 문자열을 쉽게 읽을 수 있습니다.
vicenteherrera

1
대시 대신 밑줄을 사용하려면 : name = slugify (s, separator = '_')
vicenteherrera

3

python 3.6에 대한 답변 수정

import string
import unicodedata

validFilenameChars = "-_.() %s%s" % (string.ascii_letters, string.digits)
def removeDisallowedFilenameChars(filename):
    cleanedFilename = unicodedata.normalize('NFKD', filename).encode('ASCII', 'ignore')
    return ''.join(chr(c) for c in cleanedFilename if chr(c) in validFilenameChars)

답을 자세히 설명해 주시겠습니까?
평온

Sophie Gage도 같은 대답을 받아 들였습니다. 그러나 파이썬 3.6에서 작동하도록 수정되었습니다
장 - 로빈 Tremblay의

2

나는 많은 대답이 있다는 것을 알고 있지만 대부분 정규 표현식이나 외부 모듈에 의존하므로 내 대답을 던지고 싶습니다. 순수한 파이썬 함수, 외부 모듈 필요 없음, 정규 표현식 사용 없음. 내 접근 방식은 유효하지 않은 문자를 지우는 것이 아니라 유효한 문자 만 허용하는 것입니다.

def normalizefilename(fn):
    validchars = "-_.() "
    out = ""
    for c in fn:
      if str.isalpha(c) or str.isdigit(c) or (c in validchars):
        out += c
      else:
        out += "_"
    return out    

원하는 경우 validchars영어 알파벳이없는 자국 문자와 같이 시작 부분에 고유 한 유효한 문자를 변수에 추가 할 수 있습니다 . UTF-8에서 실행되지 않는 일부 파일 시스템은 ASCII가 아닌 문자에 여전히 문제가있을 수 있습니다.

이 함수는 단일 파일 이름의 유효성을 테스트하기 위해 유효하지 않은 문자를 고려하여 경로 구분 기호를 _로 바꿉니다. 이를 추가 if하려면 os 경로 구분 기호를 포함 하도록 수정하는 것이 간단합니다 .


1

이러한 솔루션의 대부분은 작동하지 않습니다.

'/ hello / world'-> 'helloworld'

'/ helloworld'/-> 'helloworld'

이것은 일반적으로 원하는 것이 아닙니다. 각 링크의 HTML을 저장한다고 가정하면 다른 웹 페이지의 HTML을 덮어 쓸 것입니다.

나는 다음과 같은 구술을 피클합니다.

{'helloworld': 
    (
    {'/hello/world': 'helloworld', '/helloworld/': 'helloworld1'},
    2)
    }

2는 다음 파일 이름에 추가해야하는 숫자를 나타냅니다.

dict에서 매번 파일 이름을 찾습니다. 존재하지 않으면 필요한 경우 최대 수를 추가하여 새 것을 만듭니다.


helloworld1을 사용하는 경우 helloworld1이 사용되지 않는지 등을 확인해야합니다.
robert king

1

OP가 요청한 것이 아니라 독창적이고 가역적 인 변환이 필요하기 때문에 이것이 내가 사용하는 것입니다.

# p3 code
def safePath (url):
    return ''.join(map(lambda ch: chr(ch) if ch in safePath.chars else '%%%02x' % ch, url.encode('utf-8')))
safePath.chars = set(map(lambda x: ord(x), '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-_ .'))

최소한 sysadmin의 관점에서는 결과를 "약간"읽을 수 있습니다.


파일 이름에 공백이없는 래퍼 :def safe_filename(filename): return safePath(filename.strip().replace(' ','_'))
SpeedCoder5

1

패키지 설치가 마음에 들지 않으면 다음과 같이 유용합니다. https://pypi.org/project/pathvalidate/

에서 https://pypi.org/project/pathvalidate/#sanitize-a-filename :

from pathvalidate import sanitize_filename

fname = "fi:l*e/p\"a?t>h|.t<xt"
print(f"{fname} -> {sanitize_filename(fname)}\n")
fname = "\0_a*b:c<d>e%f/(g)h+i_0.txt"
print(f"{fname} -> {sanitize_filename(fname)}\n")

산출

fi:l*e/p"a?t>h|.t<xt -> filepath.txt
_a*b:c<d>e%f/(g)h+i_0.txt -> _abcde%f(g)h+i_0.txt

0

나는 이것이 반복되는 문자열을 수정하기 때문에 큰 대답이 아니라고 확신하지만 잘 작동하는 것 같습니다.

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, '')

"".join( x for x in s if (x.isalnum() or x in "._- "))게시물 댓글 에서 이것을 찾았 습니다
SergioAraujo

0

최신 정보

이 6 살짜리 대답에서 수리를 넘어 모든 링크가 끊어졌습니다.

또한 더 이상이 방법을 사용하지 않고 base64안전하지 않은 문자를 인코딩하거나 삭제하십시오. 파이썬 3 예제 :

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

base64 사용하면 인코딩 및 디코딩 할 수 있습니다, 그래서 당신은 다시 원래의 파일 이름을 검색 할 수 있습니다.

그러나 사용 사례에 따라 임의의 파일 이름을 생성하고 메타 데이터를 별도의 파일 또는 DB에 저장하는 것이 좋습니다.

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'

오리지널 링크 로트 답변 :

그만큼 bobcat프로젝트에는 작업을 수행하는 Python 모듈이 포함되어 있습니다.

완전히 견고하지는 않습니다.이 게시물 과이 회신을 참조하십시오. . .

따라서 언급했듯이 : base64가독성이 중요하지 않으면 인코딩이 더 나은 아이디어 일 것입니다.


모든 링크가 죽었습니다. 남자, 뭔가 해
평화로운 코더
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.