Backslash-Chaos nach execfile

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
marc76
User
Beiträge: 10
Registriert: Mittwoch 25. Oktober 2006, 13:23

Hallo,
ich habe ein Pyhton-Skript mit dem ich ein anderes aufrufe und daraufhin eine Datei schreibe. Schon nachdem ich das zweite Python-Skript mit

Code: Alles auswählen

import tkFileDialog
filenameMaster=tkFileDialog.askopenfilename()
execfile(filenameMaster)
ausgeführt habe, ist der Eintrag in meinem Dict, der wie folgt in der augeführten Datei drinsteht verfälscht:

Code: Alles auswählen

myDict={"Pfad" : '\\server1.avs\Test\Test.cfg'}
Gebe ich das DictElement aus ergibt sich folgendes:

Code: Alles auswählen

print myDict["Pfad"]

'\\server1.avs\\Test\\Test.cfg'
d.h. es wird nicht mehr unterschieden zwischen \ und \\

Den Code in dem auszuführenden Python-Skript muss unverändert bleiben. Was kann ich tun um die Backslashes richtig in dem DictElement zu haben???

Danke u Gruß
Marc
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo Marc, willkommen im Forum,
marc76 hat geschrieben:Was kann ich tun um die Backslashes richtig in dem DictElement zu haben???
Du musst einfach nur den String als Raw-String definieren:

Code: Alles auswählen

In [3]: myDict = {'Pfad' : r'\\server1.avs\Test\Test.cfg'}
In [4]: print myDict['Pfad']
\\server1.avs\Test\Test.cfg
Du siehst, von dem String ist ein kleines 'r', welches besagt, dass etwaige Sonderbehandlungen für Slashes abgeschaltet werden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
marc76
User
Beiträge: 10
Registriert: Mittwoch 25. Oktober 2006, 13:23

Danke für die nette Begrüßung :)

Leider habe ich das Problem, dass die ursprüngliche Zuweisung nicht geändert werden DARF aber genau so wiederhergestellt werden muss.

Code: Alles auswählen

myDict={"Pfad" : '\\server1.avs\Test\Test.cfg'}
muss also fest bleiben. Kann die Rekonstruktion mit dieser Zuweisung überhaupt funktionieren?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

marc76 hat geschrieben:Leider habe ich das Problem, dass die ursprüngliche Zuweisung nicht geändert werden DARF aber genau so wiederhergestellt werden muss.
Wieso? Sie ist fehlerhaft, Durch die Backslashes können verschiedene, sehr komische DInge passieren wie zum beispiel die Auswertung von \\ zu \, von \b zu einem Beep, die Auswertung von \n zu einem Zeilenumbruch, die Auswertung von \t zu einem Tabulator.

Weiterhin habe ich nicht verstanden, wo sich bei dir die Zuweisung ändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

marc76 hat geschrieben:Leider habe ich das Problem, dass die ursprüngliche Zuweisung nicht geändert werden DARF aber genau so wiederhergestellt werden muss.

Code: Alles auswählen

myDict={"Pfad" : '\\server1.avs\Test\Test.cfg'}
muss also fest bleiben. Kann die Rekonstruktion mit dieser Zuweisung überhaupt funktionieren?
Nein. Nicht Zeichen für Zeichen wie es dort steht. Aber warum muss das unbedingt sein? Reicht es nicht wenn die gleichen Werte in dem Dictionary stehen, egal wie sie dargestellt werden?

Code: Alles auswählen

In [23]: '\\server1.avs\Test\Test.cfg'
Out[23]: '\\server1.avs\\Test\\Test.cfg'

In [24]: '\\server1.avs\Test\Test.cfg' == '\\server1.avs\\Test\\Test.cfg'
Out[24]: True
Wie Du siehst handelt es sich um die gleiche Zeichenkette nur anders dargestellt.

Du solltest wirklich ganz dringend Leonidas' Rat beherzigen und entweder ein 'r' davor schreiben, so dass die Backslashes ihre Sonderbedeutung verlieren, oder die Backslashes selbst per Hand verdoppeln, also ``'\\\\server1.avs\\Test\\Test.cfg'``.

Es kann auch sein, das die jetztige Form einen Fehler enthält. Ich habe nämlich die Vermutung, dass Da am Anfang zwei Backslashes in der Zeichenkette vorhanden sein sollen -- da steht aber nur einer:

Code: Alles auswählen

In [25]: print '\\server1.avs\Test\Test.cfg'
\server1.avs\Test\Test.cfg
Ausserdem bekommst Du ganz schnell Probleme wenn nach so einem einzelnen Backslash ein gültiges Escape-Zeichen kommt, wenn die beiden T's klein geschrieben würden, dann hättest Du plötzlich keine Backslashes mehr und Tabulatoren anstelle der kleinen T's.

Code: Alles auswählen

In [26]: print '\\server1.avs\test\test.cfg'
\server1.avs    est     est.cfg
marc76
User
Beiträge: 10
Registriert: Mittwoch 25. Oktober 2006, 13:23

mmmh... danke für eure Tipps!

Ist halt ein bissl blöd. Hierbei handelt es sich um ein Kundenprojekt:

Das ursprüngliche Python-Skript besteht und soll fest sein.

Aufgabe:
- Sinnvolles Schreiben aller Informationen von dem Skript in eine Datenbank
- Aus den Informationen in der Datenbank das ursprüngliche File wieder generieren lassen

Letztendlich soll das generierte File 1:1 so aussehen (also rein von den enthaltenen Informationen nicht von dem Layout) wie das ursprüngliche...

ABER: wenn die Inhalte der Dicts wie von Blackjack beschrieben ja anscheinend wirklich gleich sind, sollte das echt keine Rolle spielen... Ich werde auf jeden Fall die Backslashproblematik beim Kunden monieren :)

Dankeeeeeeeeeee!

Edit (Loenidas): Thread verschoben, hatte mit Tkinter eigentlich nichts zu tun.
Antworten