Seite 1 von 1
sources.list als list
Verfasst: Samstag 15. Januar 2005, 11:09
von mitsuhiko
Hallo Leute.
Ihr kennt sicher die sources.list von debian
Code: Alles auswählen
deb http://ftp.de.debian.org/debian/ unstable main contrib non-free
deb ftp://ftp.nerim.net/debian-marillat/ testing main
...
Wie kann ich die Liste in so eine Liste bekommen:
Code: Alles auswählen
sources [
["deb", "http://ftp.de.debian.org/debian/", "unstable", ["main", "contrib", "non-free"]
["deb", "ftp://ftp.nerim.net/debian-marillat/", "testing" ["main"]
]
Kann mir da jemand helfen?
Verfasst: Samstag 15. Januar 2005, 11:43
von XT@ngel
Ich musst mein debian vor nem monat löschen deshalb kann ich jetzt nicht zu 100% testen:
Code: Alles auswählen
str = "deb http://ftp.de.debian.org/debian/ unstable main contrib non-free"
def sourceLine2list(sourceLine):
ok = sourceLine.split(" ", 3)
ok[3] = ok[3].split(" ")
return ok
print sourceLine2list(str)
Und nicht vergessen auf eine leere Zeile zu prüfen.
MfG
Andreas
Edit (Leonidas): Code in Python Tags gesetzt
Verfasst: Samstag 15. Januar 2005, 11:47
von Dookie
Hi blackbird,
Code: Alles auswählen
f = file("/etc/apt/sources.list", "r")
data = []
for line in f:
entry = line.split("#")[0] # cut comment
entry = entry.split(None,3)
if entry: # skip empty or commented out entries
entry[-1] = entry[-1].split() # split last item of entry
data.append(entry)
f.close()
print data
Gruß
Dookie
Verfasst: Samstag 15. Januar 2005, 11:49
von mitsuhiko
// Edit: Ich nehme lieber dookies methode:
Code entfernt -> liegt 2 posts weiter unten
Verfasst: Samstag 15. Januar 2005, 11:59
von Dookie
Achtung, es könnten auch die Enträge mit Tabs oder mehreren Leerzeichen getrennt sein, dann baut ein line.split(" ") natürlich mist!
besser und stabiler ist ein line.split() das beides richtig verarbeiten kann. Statt self._value.split("\n") ist auch self._value.splitlines() möglich. Statt if items[0] == "deb" or items[0] == "deb-src": besser
if items[0].startswith("deb"): oder gleich if line.startswith("deb"): noch vor dem line.split() fänd ich auch besser.
Gruß
Dookie
Verfasst: Samstag 15. Januar 2005, 12:02
von mitsuhiko
Dookie hat geschrieben:Achtung, es könnten auch die Enträge mit Tabs oder mehreren Leerzeichen getrennt sein, dann baut ein line.split(" ") natürlich mist!
besser und stabiler ist ein line.split() das beides richtig verarbeiten kann. Statt self._value.split("\n") ist auch self._value.splitlines() möglich. Statt if items[0] == "deb" or items[0] == "deb-src": besser
if items[0].startswith("deb"): oder gleich if line.startswith("deb"): noch vor dem line.split() fänd ich auch besser.
Gruß
Dookie
Ich bin jetzt sowieso auf deine Methode umgestiegen.
Vielleicht kann jemand sowas auch noch brauchen:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import md5
import sys
import re
def create_unique_id(self):
"""
Creates an unique md5 hash
"""
return md5.new(str(time.time()+random.random())).hexdigest()
# CONFIG WRITERS AND READERS
class base_config_handle:
def __init__(self, filename):
f = file(filename, "r")
self._value = f.read()
self._parsed = {}
f.close()
self._filename = filename
def save(self):
f = file(self._filename, "w")
f.write(self.string_output())
f.close()
def parse(self): pass
def string_output(self): return self._value
# CONFIG HANDLE FOR DEBIAN SOURCES LIST
class apt_config_handle(base_config_handle):
def parse(self):
data = []
lines = self._value.split("\n")
for line in lines:
entry = line.split("#")[0]
entry = entry.split(None,3)
if entry:
entry[-1] = entry[-1].split()
data.append(entry)
self._value = data
def string_output(self):
str = ""
for item in self._value:
line = " ".join([item[0], item[1], item[2]])+" "+" ".join(item[3])
str += line+"\n"
return str
Verfasst: Samstag 15. Januar 2005, 12:18
von Leonidas
Meine Alternative sieht so aus:
Code: Alles auswählen
def slparser(source="/etc/apt/sources.list"):
sl = file(source, 'r')
servers = []
for line in sl:
entry= line.splitlines()[0]
if line.startswith("deb"):
entry = entry.split(None, 3)
try:
entry[3] = entry[3].split()
except IndexError:
# Diese Zeile hat keine Auswahl zwischen main, contrib oder non-free
pass
servers.append(entry)
sl.close()
return servers
Das schöne daran ist, sie parst auch solche Dateien
Code: Alles auswählen
deb http://192.168.123.1/debian stable main
deb http://192.168.123.1/webmin ./
deb http://192.168.123.1/squid ./
deb http://ftp.de.debian.org/debian/ unstable main contrib non-free
# deb http://security.debian.org/ stable/updates main
Das Problem ist, wie ich jetzt gesehen habe, nachdem ich es abgeschickt habe, dass Dookie geschrieben hat, dass split(' ', 3) schlecht ist. Obwohl ich glaube, dass kaum jemand seine sources.list mit Tabs trennt.
Verfasst: Samstag 15. Januar 2005, 12:41
von Dookie
naja, Tabs vielleicht nicht, aber mehrere Leerzeichen, damit die Einträge schön untereinander stehen?
Dookie
Verfasst: Samstag 15. Januar 2005, 12:49
von Leonidas
Dookie hat geschrieben:naja, Tabs vielleicht nicht, aber mehrere Leerzeichen, damit die Einträge schön untereinander stehen?
Ja, stimmt, das ist warscheinlicher. Aber man kann mit split scheinbar nicht generell nach Whitespaces
und nur drei mal splitten, oder?
Verfasst: Samstag 15. Januar 2005, 14:18
von Dookie
klar kann man, siehe meine Lösung. Einfach als Splitstring None verwenden dann wird generell an Whitespaces gesplittet, egal ob ein oder mehrere Spaces oder Tabs oder sonstwas Whitespaciges.
Dookie
Verfasst: Samstag 15. Januar 2005, 14:36
von Leonidas
Okay, ich hab meinen Code korrigiert.