valerius21 valerius21 - 3 years ago 226
Bash Question

Python/Bash - Get filenames with escaped characters

How can I parse filenames with spaces, parentheses etc. into a variable?

'Album Artist - Song name (feat Musician) [Year]'


'Album\ Artist\ \- Song\ name\ \(feat\ Musician\)\ \[Year\]'

I get the right format with
. However if I store the print from
into a variable it gets reversed to the initial naming. I know that I could use the
"string".replace('x', 'y')
method. But it does not appeal safe to me.

Does anybody know how I can fix this or work around this problem?
Using Python 3.5.3 btw.

EDIT example code:

>>> import re
>>> # this is an example array in the format how my filenames are named stored in files >>> files = ['AA - BB (CC) [DD]', 'EE - FF (GG) [HH]', 'II - JJ (KK) [LL]']
>>> for f in files:
... print(f)
AA - BB (CC) [DD]
EE - FF (GG) [HH]
II - JJ (KK) [LL]
>>> for f in files:
... print(re.escape(f))
AA\ \-\ BB\ \(CC\)\ \[DD\] # desired format
EE\ \-\ FF\ \(GG\)\ \[HH\]
II\ \-\ JJ\ \(KK\)\ \[LL\]
>>> escaped = re.escape(files[0])
>>> escaped
'AA\\ \\-\\ BB\\ \\(CC\\)\\ \\[DD\\]' # actual result

Answer Source

The underlying problem sounds like passing file names that may contain characters that would need to be escaped as arguments to another program. I suggest looking at subprocess.

Specifically, see frequently used arguments:

args is required for all calls and should be a string, or a sequence of program arguments. Providing a sequence of arguments is generally preferred, as it allows the module to take care of any required escaping and quoting of arguments (e.g. to permit spaces in file names). If passing a single string, either shell must be True (see below) or else the string must simply name the program to be executed without specifying any arguments.

For example:

import subprocess

file_names = [r'AA - BB (CC) [DD]', r'EE - FF (GG) [HH]', r'II - JJ (KK) [LL]']

for file_name in file_names:[r'touch', file_name])
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download