Seite 1 von 1

Datei mit Leerzeichen öffnen

Verfasst: Freitag 1. Juli 2011, 14:40
von ayk
Hallo wehrte Gemeinde,

ich habe ein kleines Script welches mir eine Datei öffnen soll und den Inhalt in eine Liste speichert. Kein Problem für Dateien ohne Leezeichen. So weit so gut. Beim öffnen von Dateien mit Leerzeichen gibt es aber Probleme.
Folgende Datei möchte ich öffnen:
ls
/omd/sites/testenv/var/check_mk/logwatch/A0006478/C:\Program Files (x86)\Matrix42\Matrix42 Service Store\Logs\HostCommon.log
Die Datei stammt aus einem Windows System und wird auf einem Linux Rechner gespeichert. Daher der etwas seltsame Pfad. Der Dateiname entspricht dem kompletten Pfad aus dem Windows System und muss auch so erhalten bleiben!

Jetzt mal der Codeschnipsel der die Datei öffnen soll:

Code: Alles auswählen

if re.match('LOG', servicename):
    print('Ein LOG Service')
    logpath = basedir + '/var/check_mk/logwatch/' + hostname + '/' + servicename.split('LOG ')[-1]
    #logpath = os.path.normpath(logpath)
    print (logpath)
    #print (logpath)= /omd/sites/testenv/var/check_mk/logwatch/A0006478/C:\Program Files x86\Matrix42\Matrix42 Service Store\Logs\HostCommon.log
    file = open(logpath, 'r')
    for line in file.readlines():
        if re.match('W', line) or re.match('C', line):
            #print(line)
            loglines.append(line + '\n')
    loglines = ''.join(loglines)

Ergebnis ist dann:
IOError: [Errno 2] No such file or directory: '/omd/sites/testenv/var/check_mk/logwatch/A0006478/C:\\Program Files x86\\Matrix42\\Matrix42 Service Store\\Logs\\HostCommon.log'
Auch aus der shell kann das File nur aufgerufen werden wenn man Sonderzeichen und Leerzeichen escaped:
cat var/check_mk/logwatch/A0006478/C\:\\Program\ Files\ \(x86\)\\Matrix42\\Matrix42\ Service\ Store\\Logs\\HostCommon.log
Wie bekomme ich das jetzt elegant mit Python hin?
Selbst wenn ich den Pfad so wie ich ihn auf der Shell nutze Hardcoded in das Skript eingebe, also:

Code: Alles auswählen

logpath = "omd/sites/testenv/var/check_mk/logwatch/A0006478/C\:\\Program\ Files\ \(x86\)\\Matrix42\\Matrix42\ Service\ Store\\Logs\\HostCommon.log"
Erhalte ich einen IOError:
IOError: [Errno 2] No such file or directory: 'omd/sites/testenv/var/check_mk/logwatch/A0006478/C\\:\\Program\\ Files\\ \\(x86\\)\\Matrix42\\Matrix42\\ Service\\ Store\\Logs\\HostCommon.log'
Ihr seit meine letzte Hoffnung bevor ich wahsinnig werde.................

Bedankt!

Re: Datei mit Leerzeichen öffnen

Verfasst: Freitag 1. Juli 2011, 15:14
von BlackJack
@ayk: Du must Dir halt klar machen was escaped wird, und was nicht. Und zwar in der jeweiligen Umgebung wo es benutzt wird. In Python hast Du offensichtlich mehr escaped als nötig ist, beziehungsweise Backslashes eingefügt, die nicht im tatsächlichen Dateinamen vorhanden sind. Nicht alles was man vor der Shell schützen muss, ist in literalen Python-Zeichenketten auch eine Escape-Sequenz. Ein Beispiel:

Code: Alles auswählen

$ echo \:
:

Code: Alles auswählen

In [15]: print '\:'
\:

Re: Datei mit Leerzeichen öffnen

Verfasst: Freitag 1. Juli 2011, 16:35
von ayk
Hallo BlackJack,

erstmal Danke für deinen Input!

In meinem verwirrten Zustand habe ich übersehen meine externe Quelle (Nagios) den Dateinamen schon falsch liefert!
Die Datei wird zwar im FS korrekt angelegt aber unter anderem Namen als Service angelegt (ohne die Klammern um x86). Die Variable $SERVICEDESC$ enthält die Klammern nicht und kommt somit auch falsch in Python an.

Eine andere Variable $SERVICENOTESURL$ hält anscheinend den gesamten String, allerdings werden hier Sonderzeichen als ASCII(?) Code gespeichert.
Der Dateiname sieht nun so aus:
C%253A%255CProgram%2520Files%2520%2528x86%2529%255CMatrix42%255CMatrix42%2520Service%2520Store%255CLogs%255CHostCommonX86.log
Mit der replace Funktion dürfte das recht mühselig werden. Vielleicht hat noch jemand einen Hinweis wie man hier vorgehen könnte.

Gruß

ayk

Re: Datei mit Leerzeichen öffnen

Verfasst: Freitag 1. Juli 2011, 17:30
von BlackJack
@ayk: Das ist ja, äh, interessant. Das ist URL-kodiert. Und zwar *doppelt*:

Code: Alles auswählen

In [20]: s
Out[20]: 'C%253A%255CProgram%2520Files%2520%2528x86%2529%255CMatrix42%255CMatrix42%2520Service%2520Store%255CLogs%255CHostCommonX86.log'

In [21]: urlparse.unquote(s)
Out[21]: 'C%3A%5CProgram%20Files%20%28x86%29%5CMatrix42%5CMatrix42%20Service%20Store%5CLogs%5CHostCommonX86.log'

In [22]: urlparse.unquote(urlparse.unquote(s))
Out[22]: 'C:\\Program Files (x86)\\Matrix42\\Matrix42 Service Store\\Logs\\HostCommonX86.log'