\n im string entfernen?

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
Gast

Donnerstag 27. Januar 2005, 19:33

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 27. Januar 2005, 19:43

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
[code]#!/usr/bin/env python
import this[/code]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 27. Januar 2005, 19:46

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
[code]#!/usr/bin/env python
import this[/code]
Gast

Donnerstag 27. Januar 2005, 20:02

Das funktioniert super.
Danke!
BlackJack

Montag 31. Januar 2005, 12:54

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)
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 31. Januar 2005, 13:09

Warum nicht einfach:

Code: Alles auswählen

os.system('cp "%s" "%s"' % (line.rstrip(),  backupdir))
Unter windows würde ich es so machen...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 31. Januar 2005, 13:25

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
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 31. Januar 2005, 13:33

Wie wäre es denn mit splitlines()? Ich nutze das immer und es ist recht praktisch, meist als splitlines()[0].
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 31. Januar 2005, 13:50

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
[code]#!/usr/bin/env python
import this[/code]
BlackJack

Montag 31. Januar 2005, 15:01

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
Antworten