string translate, replace, find and the forward slash

D

destroooooy

Hi folks,
I'm finding some (what I consider) curious behavior with the string
methods and the forward slash character. I'm writing a program to
rename mp3 files based on their id3 tags, and I want to protect
against goofy characters in the in tags. So I do the following:

unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
alt_chars = "_________________________"

s_artist.translate(maketranstable(unsafe_chars, alt_chars))


which successfully replaces everything except for forward slashes (at
least in the files I've tested so far). If I use the "replace()"
method, it also does not work. Escaping the forward slash changes
nothing. "find()" however, works, and thus I've resorted to:

if "/" in s_artist:
(s_l, slash, s_r) = s_artist.partition("/")
s_artist = "_".join([s_l, s_r])

which is rather uncool. It works but I'd just like to know what the
deal is. TIA.
 
A

Arnaud Delobelle

destroooooy said:
Hi folks,
I'm finding some (what I consider) curious behavior with the string
methods and the forward slash character. I'm writing a program to
rename mp3 files based on their id3 tags, and I want to protect
against goofy characters in the in tags. So I do the following:

unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
alt_chars = "_________________________"

s_artist.translate(maketranstable(unsafe_chars, alt_chars))


which successfully replaces everything except for forward slashes (at
least in the files I've tested so far). If I use the "replace()"
method, it also does not work. Escaping the forward slash changes
nothing. "find()" however, works, and thus I've resorted to:

if "/" in s_artist:
(s_l, slash, s_r) = s_artist.partition("/")
s_artist = "_".join([s_l, s_r])

which is rather uncool. It works but I'd just like to know what the
deal is. TIA.

It works fine here:

marigold:junk arno$ python
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
table = range(256)
for c in unsafe_chars: table[ord(c)] = ord('_') ....
table = ''.join(chr(o) for o in table)
'Jon(&Mark/Steve)'.translate(table) 'Jon__Mark_Steve_'
 
D

destroooooy

destroooooy said:
Hi folks,
I'm finding some (what I consider) curious behavior with the string
methods and the forward slash character. I'm writing a program to
rename mp3 files based on their id3 tags, and I want to protect
against goofy characters in the in tags. So I do the following:
unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
alt_chars = "_________________________"
s_artist.translate(maketranstable(unsafe_chars, alt_chars))
which successfully replaces everything except for forward slashes (at
least in the files I've tested so far). If I use the "replace()"
method, it also does not work. Escaping the forward slash changes
nothing. "find()" however, works, and thus I've resorted to:
if "/" in s_artist:
(s_l, slash, s_r) = s_artist.partition("/")
s_artist = "_".join([s_l, s_r])
which is rather uncool. It works but I'd just like to know what the
deal is. TIA.

It works fine here:

marigold:junk arno$ python
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
table = range(256)
for c in unsafe_chars: table[ord(c)] = ord('_') ...
table = ''.join(chr(o) for o in table)
'Jon(&Mark/Steve)'.translate(table)
'Jon__Mark_Steve_'


Oooh. Let me try it that way.
 
D

destroooooy

destroooooy said:
Hi folks,
I'm finding some (what I consider) curious behavior with the string
methods and the forward slash character. I'm writing a program to
rename mp3 files based on their id3 tags, and I want to protect
against goofy characters in the in tags. So I do the following:
unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
alt_chars = "_________________________"
s_artist.translate(maketranstable(unsafe_chars, alt_chars))
which successfully replaces everything except for forward slashes (at
least in the files I've tested so far). If I use the "replace()"
method, it also does not work. Escaping the forward slash changes
nothing. "find()" however, works, and thus I've resorted to:
if "/" in s_artist:
(s_l, slash, s_r) = s_artist.partition("/")
s_artist = "_".join([s_l, s_r])
which is rather uncool. It works but I'd just like to know what the
deal is. TIA.

It works fine here:

marigold:junk arno$ python
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
table = range(256)
for c in unsafe_chars: table[ord(c)] = ord('_') ...
table = ''.join(chr(o) for o in table)
'Jon(&Mark/Steve)'.translate(table)
'Jon__Mark_Steve_'


Okay, so that definitely works. Thanks!

However, the chances of me coming up with that on my own were
completely nonexistent, and I'd still like to know how one would use
maketranstable() to get the same result...
 
A

Arnaud Delobelle

destroooooy said:
marigold:junk arno$ python
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
table = range(256)
for c in unsafe_chars: table[ord(c)] = ord('_') ...
table = ''.join(chr(o) for o in table)
'Jon(&Mark/Steve)'.translate(table)
'Jon__Mark_Steve_'


Okay, so that definitely works. Thanks!

However, the chances of me coming up with that on my own were
completely nonexistent, and I'd still like to know how one would use
maketranstable() to get the same result...

Do you mean maketrans() from the string module? I didn't know about
it, but I've tried it and it works too:
import string
unsafe_chars = "/#()[]!@$%^&*{}\'\"`?<>| \t\n"
alt_chars = "_________________________"
table = string.maketrans(unsafe_chars, alt_chars)
"a/b/c".translate(table) 'a_b_c'
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top