sources.list als list

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Samstag 15. Januar 2005, 11:09

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?
TUFKAB – the user formerly known as blackbird
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Samstag 15. Januar 2005, 11:43

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

Samstag 15. Januar 2005, 11:47

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
[code]#!/usr/bin/env python
import this[/code]
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Samstag 15. Januar 2005, 11:49

// Edit: Ich nehme lieber dookies methode:

Code entfernt -> liegt 2 posts weiter unten
Zuletzt geändert von mitsuhiko am Samstag 15. Januar 2005, 12:03, insgesamt 1-mal geändert.
TUFKAB – the user formerly known as blackbird
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Samstag 15. Januar 2005, 11:59

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
[code]#!/usr/bin/env python
import this[/code]
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Samstag 15. Januar 2005, 12:02

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
TUFKAB – the user formerly known as blackbird
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 15. Januar 2005, 12:18

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.
Zuletzt geändert von Leonidas am Samstag 15. Januar 2005, 14:35, insgesamt 1-mal geändert.
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:

Samstag 15. Januar 2005, 12:41

naja, Tabs vielleicht nicht, aber mehrere Leerzeichen, damit die Einträge schön untereinander stehen?


Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 15. Januar 2005, 12:49

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?
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:

Samstag 15. Januar 2005, 14:18

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

Samstag 15. Januar 2005, 14:36

Okay, ich hab meinen Code korrigiert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten