Seite 1 von 1
\n im string entfernen?
Verfasst: Donnerstag 27. Januar 2005, 19:33
von Gast
Hi,
ich habe da so ein kleines Problemchen. Es geht darum, dass ich mir ein kleines Backupscript geschrieben hab, welches nicht richtig funktioniert, weil sich in einem String ein \n befindet, welches ich nicht geschaft habe zu entfernen. Das Script sieht folgendermassen aus:
Code: Alles auswählen
#!/usr/bin/python
# Variables to edit
backupindex = '/home/project/.pyback'
backupdir = '/home/project/doc/'
import sys
import os
f = open(backupindex, 'r')
files = f.readlines()
while 1:
try:
file = files.pop()
except:
print 'List ended, or ERROR.'
sys.exit()
os.system('cp %s %s' % (file, backupdir))
Das Problem liegt daran, dass der cp-Befehl durch das Newline in 'file' unterbrochen wird, was dann zu einem Fehler fuehrt, da ich kein Verzeichniss angegeben habe, an die es die Datei kopieren soll. Da gibt es sicher eine ganz simple und einfache Loesung, aber ich habe leider keine gefunden, weder bei Google, noch hier im Forum.
Verfasst: Donnerstag 27. Januar 2005, 19:43
von Dookie
Hi,
Du kannst auch
files.pop().rstrip('\n') verwenden, dann werden Leezeichen am Zeilenende nicht entfernt.
Da file ein Buildin ist, sollte man Variablen nicht file nennen!
Gruß
Dookie
Verfasst: Donnerstag 27. Januar 2005, 19:46
von Dookie
Das ganze geht aber auch noch eleganter:
Code: Alles auswählen
#!/usr/bin/env python
import sys
import os
# Variables to edit
backupindex = '/home/project/.pyback'
backupdir = '/home/project/doc/'
f = open(backupindex, 'r')
for line in f:
os.system('cp %s %s' % (line.rstrip(), backupdir))
f.close()
Gruß
Dookie
Verfasst: Donnerstag 27. Januar 2005, 20:02
von Gast
Das funktioniert super.
Danke!
Verfasst: Montag 31. Januar 2005, 12:54
von BlackJack
Mir fallen auf Anhieb 2 Probleme ein/auf:
1. Es funktioniert so nicht mit Dateinamen, die Leerzeichen enthalten. Bei der Datei "Hello World.txt" würde der Befehl "cp Hello World.txt $ziel" ausgeführt.
2. Mit str.rstrip() werden
alle Whitespace Zeichen am Zeilenende beseitigt, also auch wenn der Dateiname mit einem oder mehreren Leerzeichen endet.
Lösungsansatz: die copy() Funktion aus dem shutil-Modul verwenden und nur das letzte Zeichen entfernen:
Verfasst: Montag 31. Januar 2005, 13:09
von jens
Warum nicht einfach:
Code: Alles auswählen
os.system('cp "%s" "%s"' % (line.rstrip(), backupdir))
Unter windows würde ich es so machen...
Verfasst: Montag 31. Januar 2005, 13:25
von Dookie
Hi,
also wer bei Dateinamen Am Ende Spaces oder Tabs anhängt ist wohl selber schuld wenns dann nicht klappt

Ansonst kann man bei rstrip() ja auch die zu entfernenden Zeichen angeben
Code: Alles auswählen
os.system('cp "%s" "%s"' % (line.rstrip('\r\n'), backupdir))
Gruß
Dookie
Verfasst: Montag 31. Januar 2005, 13:33
von Leonidas
Wie wäre es denn mit splitlines()? Ich nutze das immer und es ist recht praktisch, meist als splitlines()[0].
Verfasst: Montag 31. Januar 2005, 13:50
von Dookie
Hi Leonidas,
bei splitlines() musst du die ganze Datei schon eingelesen haben um sie dann zu splitten, bei unserem Beispiel wird die Datei zeilenweise gelesen.
Gruß
Dookie
Verfasst: Montag 31. Januar 2005, 15:01
von BlackJack
Dookie hat geschrieben:Hi,
also wer bei Dateinamen Am Ende Spaces oder Tabs anhängt ist wohl selber schuld wenns dann nicht klappt

Ansonst kann man bei rstrip() ja auch die zu entfernenden Zeichen angeben
Code: Alles auswählen
os.system('cp "%s" "%s"' % (line.rstrip('\r\n'), backupdir))
Bei einem Backup-Skript sollte man eigentlich erwarten, dass es mit allen Dateinamen klarkommt. Das schützen mit "-Zeichen funktioniert nicht wenn im Namen selbst ein "-Zeichen vorkommt und Umgebungsvariablen a la "$HOME" haben auch lustige Effekte. Was bei os.system() angegeben wird, sieht und interpretiert halt die Shell vorher.
Und wenn Dich jemand nicht mag, dann legt er eine Datei mit dem Namen '"; rm -rf /;' an.
