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,

Code: Alles auswählen

lines = files.pop().rstrip()
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:

Code: Alles auswählen

for line in f: 
    shutil.copy(line[:-1],  backupdir)

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. :-D