2017-02-24 6 views
0

ich Verzeichnisse haben, die enthält '\ x ..' Zeichen wie '\ x00':Ersetzen ' x ..' Litteral Zeichenfolge in Python

#ls 
c\x00mb 

und ich möchte, dass sie ohne diese umzubenennen, da Wenn ich diese Dateien in Windows kopiere, werden sie unbrauchbar. Also mein Python-Skript durch diese Verzeichnisse wird und die problematischen Zeichen die folgende Art und Weise Nachweis:

if '\\x' in dir: # dir is the name of the current directory 

Zuerst dachte ich, ich dieses Problem loswerden könnte das re Modul in Python unter Verwendung:

new_dir_name = re.sub('\x00', r'', dir) # I am using \x00 as an example 

Aber das hat nicht funktioniert. Gibt es eine Möglichkeit, diese Zeichen durch Python zu ersetzen?

EDIT: um zu verstehen, die char, wenn ich ls zu xxdxxd Rohr die '\' Zeichen erscheint in der Ascii-Darstellung. In hexadezimal zeigt es 5c '

+0

Ich würde beginnen, indem Sie eine 'os.listdir()' in Python und überprüfen, wie Python die Zeichenfolgendarstellung dieser Verzeichnisnamen aussieht. – turbulencetoo

+1

könnte so einfach sein wie 'new_dir_name = dir.replace ('\ 0', '')' – turbulencetoo

+0

os.listdir (dir_path) gibt 'c \\ x00mb'. Lassen Sie mich versuchen, die dir.replace – aze

Antwort

2

Diese string.replace für mich gearbeitet:

dir = r'foo\x00bar' 
print dir 
dir.replace(r'\x00', '') 
print dir 

Ausgang ist:

foo\x00bar 
foobar 

string.replace(s, old, new[, maxreplace])

Return eine Kopie von String s mit Alle Vorkommen der Teilzeichenfolge alt werden durch new ersetzt. Wenn das optionale Argument maxreplace angegeben wird, werden die ersten maxreplace-Vorkommen ersetzt.

Ein regulärer Ausdruck könnte auch für den allgemeinen Fall arbeiten, aber Sie werden den Backslash entkommen müssen, so dass \x selbst nicht als reguläre Ausdruck Flucht interpretiert wird.

Für den allgemeinen Fall des Entfernens \x von zwei hexadezimalen Ziffern folgen:

import re 
dir = r'foo\x1Dbar' 
print dir 
re.sub(r'\\x[0-9A-F]{2}', '', dir) 
print dir 

Ausgang ist:

foo\x1Dbar 
foobar 
+0

Sie möchten vielleicht erklären, warum die Regex fehlgeschlagen ist, –

+0

die \ x00 funktioniert, aber könnte das zu einer Regex erweitert werden, um die anderen in Betracht ziehen (zum Beispiel mit \ x0A, \ x0D ...) – aze

+0

Danke @ Jean-FrançoisFabre. Antwort aktualisiert mit Regex Lösung/Erklärung – tavnab

2

Dieser Interpreter-Sitzung den Unterschied zwischen Ihrem dirname zeigen eine tatsächliche Nullzeichen haben in es, gegen ein Spiel gefolgt von einem x, gefolgt von zwei 0 s.

>>> bad_dir_name = "c\x00mb" 
>>> bad_dir_name 
'c\x00mb' 
>>> good_dir_name = bad_dir_name.replace("\x00", "") 
>>> good_dir_name 
'cmb' 
>>> 
>>> bad_dir_name2 = "c\\x00mb" 
>>> bad_dir_name2 
'c\\x00mb' 
>>> good_dir_name2 = bad_dir_name2.replace("\\", "") # remove the backslash 
>>> good_dir_name2 
'cx00mb' 

In jedem Fall ist die string.replace der Weg zu gehen.

Verwandte Themen