PDA

View Full Version : Limiting the characters Python uses to create files and directories



fuzzman54
October 4th, 2011, 07:55 AM
I'm working on porting a xbmc plugin to the xbmc4xbox, and because the xbox uses fatx, it has some crippling limitations on what characters are allowed for filenames and directories. Basically what I want to do is change this code:


def CleanFileName(s, remove_year, use_encoding = False, use_blanks = True):
if remove_year:
s = s[0:len(s)-7]
s = s.replace(' (Eng subs)', '')
s = s.replace(' (eng subs)', '')
s = s.replace(' (English subs)', '')
s = s.replace(' (english subs)', '')
s = s.replace(' (Eng Subs)', '')
s = s.replace(' (English Subs)', '')
s = s.replace('&', '&')
s = s.replace(''', '\'')
s = s.replace('Æ', 'AE')
s = s.replace('Ç', 'C')
s = s.replace('ô', 'o')
s = s.replace('é', 'e')
s = s.replace('ë', 'e')
s = s.replace('í', 'i')
s = s.replace('î', 'i')
s = s.replace('¢', 'c')
s = s.replace('â', 'a')
s = s.replace('ï', 'i')
s = s.replace('á', 'a')
s = s.replace('è', 'e')
s = s.replace('%2E', '.')
if use_encoding:
s = s.replace('"', '%22')
s = s.replace('*', '%2A')
s = s.replace('/', '%2F')
s = s.replace(':', '%3A')
s = s.replace('<', '%3C')
s = s.replace('>', '%3E')
s = s.replace('?', '%3F')
s = s.replace('\\', '%5C')
s = s.replace('|', '%7C')
s = s.replace('&frac12;', '%BD')
s = s.replace('&#xBD;', '%BD') #half character
s = s.replace('&#xB3;', '%B3')
s = s.replace('&#xB0;', '%B0') #degree character
if use_blanks:
s = s.replace('"', ' ')
s = s.replace('*', ' ')
s = s.replace('/', ' ')
s = s.replace(':', ' ')
s = s.replace('<', ' ')
s = s.replace('>', ' ')
s = s.replace('?', ' ')
s = s.replace('\\', ' ')
s = s.replace('|', ' ')
s = s.replace('&frac12;', ' ')
s = s.replace('&#xBD;', ' ') #half character
s = s.replace('&#xB3;', ' ')
s = s.replace('&#xB0;', ' ') #degree character
s = s.strip()
return s


To instead of replacing the dirty names, only allowing it to use these characters


ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789!#$%&'()-.@[]^_`{}~(SPACE)

And replace anything that isn't one of those characters with a space, and also limit the number of characters to 35. Anyone wanna point me in the right direction? :D

ofnuts
October 4th, 2011, 02:43 PM
[/CODE]
To instead of replacing the dirty names, only allowing it to use these characters


ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789!#$%&'()-.@[]^_`{}~(SPACE)And replace anything that isn't one of those characters with a space, and also limit the number of characters to 35. Anyone wanna point me in the right direction? :D
You can use excluding regexps in re.sub:


>>> import re
>>> print re.sub('[^a-z]','!','ab3cd6ef')
ab!cd!ef

StephenF
October 6th, 2011, 04:44 PM
from urllib import quote

while 1:
print quote(raw_input(), safe=" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789!#$%&'()-.@[]^_`{}~")

See also: urllib.unquote