Listelemente in String wandeln

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
Kalmuecke
User
Beiträge: 6
Registriert: Freitag 6. Oktober 2006, 17:39

Hi,

habe die Python-Skriptsprache neu entdeckt und bin daher noch nicht so fit, wie manch anderer hier im Forum.

Ich möchte gern ein kleines Skript schreiben, welches Daten aus einer CVS-Datei herausliest und dann in 2 bestimmten Spalten (sind durch ";" getrennt) 2 Strings herausliest. Diese 2 Strings sollen dann wiederum mit jeder einzelnen Zeile aus einer Error.log Datei verglichen werden. Werden die 2 Strings beide in einer der Zeilen der Error.log Datei gefunden, so soll die Zeile aus der Error.log Datei in eine Liste geschrieben werden, damit ich später daraus einen HTML-Report erstellen kann!

Bislang lese ich mit dem CVS-Reader aus der CVS Datei heraus. Über die CVS Datei soll quasi später bestimmt werden, was alles in der Error.log Datei von Bedeutung ist und im HTML-Report erscheinen soll.

Was mir jetzt aber leider nicht klar ist:
Wie bekomme ich aus einem Element der Liste den Inhalt in eine String-Variable geschrieben?? Ich muss nämlich 2 Werte aus der CVS Datei mit jeder einzelnen Zeile in der Error.log Datei vergleichen, um so gucken, ob der Wert drin vorkommt.

Wie ich bisher vorgehen wollte:
Pro Zeile aus der CVS-Datei aus meinen gewünschten 2 Spalten die Werte in Strings schreiben und dann prüfen, ob die 2 Strings in einer der Zeilen der Error.log Datei drin vorkommen! Hat vielleicht jemand von euch einen Lösungsansatz oder kann mir zumindest helfen??
Vergleich zweier Strings? Listenelement in String wandeln???

Hier mein bisheriger Code:

Code: Alles auswählen

import csv
import string
 
def readCSV(path, filename):
    contentCSV  = []
    reader      = csv.reader(open(path + filename, "rb"))   
    for row in reader:
        myString = str(row)
        if myString.find("YES") == -1: #Elements which do NOT have YES => do NOT take
            contentCSV.append(row)
 
    del contentCSV[0] #Delete headline from CSV
   
    return contentCSV
 

def readErrorFile(path, filename):
    contentErrorFile    = []
    reader              = csv.reader(open(path + filename, "rb"))   
    for row in reader:
        contentErrorFile.append(row)
 
    return contentErrorFile      
      
def main():
    contentCSV = [] # contains the content of the CVS-File
    contentCSV = readCSV("D:\\", "file.csv")
 
   
    print "\n***************************************"
    #for i in contentCSV:
     #   print i
    print "***************************************"
 
    #myString = ""
    #myString2 = ""
 
    #for i in contentCSV:
        #myString = ''.join(i)
        #myString.find(';')
        #print myString
 
    #contentErrorFile =[]
    #contentErrorFile =  readErrorFile("D:\\", "error.err")
 
    #for i in contentCSVErrorFile:
     #   print i
   
 
if __name__ == "__main__":
    main()
Danke euch vielmals!
Gruss

Kalmuecke
Kalmuecke
User
Beiträge: 6
Registriert: Freitag 6. Oktober 2006, 17:39

Keiner eine Idee!
BlackJack

Kalmuecke hat geschrieben:Ich möchte gern ein kleines Skript schreiben, welches Daten aus einer CVS-Datei herausliest und dann in 2 bestimmten Spalten (sind durch ";" getrennt) 2 Strings herausliest.
Den Trenner gibst Du in Deinem Quelltext aber gar nicht an!? Hier ist eine etwas sauberere Variante (ungetestet):

Code: Alles auswählen

import csv
import os

def read_csv(path, filename):
    in_file = open(os.path.join(path, filename), 'rb')
    reader = csv.reader(in_file, delimiter=';')
    # 
    # Read all rows without a 'YES' in any column into `result`.
    # 
    result = [row for row in reader if 'YES' not in row]
    in_file.close()
    # 
    # Delete header line.
    # 
    del result[0]
    return result
Was mir jetzt aber leider nicht klar ist:
Wie bekomme ich aus einem Element der Liste den Inhalt in eine String-Variable geschrieben??
In Python schreibt man nichts in Variablen. Diesem Bild liegt die Vorstellung zugrunde, das ein Name eine Speicherstelle bezeichnet ab der Daten abgelegt werden. In Python solltest Du besser in Objekten denken, die an Namen gebunden werden.

Wenn Du jetzt Objekte in einer Liste hast, dann kannst Du mit dem Index auf ein bestimmtes Objekt zugreifen und es an einen Namen binden:

Code: Alles auswählen

In [9]: a = ['x', 'y', 'z']

In [10]: b = a[1]

In [11]: b
Out[11]: 'y'
Vergleich zweier Strings? Listenelement in String wandeln???
Zeichenketten werden ganz normal mit ``==`` verglichen und der `csv.reader()` gibt Listen mit Zeichenketten als Elemente zurück, da braucht also nichts umgewandelt zu werden.
Kalmuecke
User
Beiträge: 6
Registriert: Freitag 6. Oktober 2006, 17:39

Danke dir vorerst! Ich werde es morgen ausprobieren!

Komme eher aus der Welt von C/C++ oder Java und da ist halt doch einiges anders! Zumindest auch teils die Denkweise!
Out[11]: 'y'
Was bedeutet denn nun der ":" ???
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kalmuecke hat geschrieben:
Out[11]: 'y'
Was bedeutet denn nun der ":" ???
Das ist nur die Ausgabe der verbesseren Python-Shell, IPython.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Kalmuecke
User
Beiträge: 6
Registriert: Freitag 6. Oktober 2006, 17:39

Leonidas hat geschrieben:
Kalmuecke hat geschrieben:
Out[11]: 'y'
Was bedeutet denn nun der ":" ???
Das ist nur die Ausgabe der verbesseren Python-Shell, IPython.
Ist das ein Editor??
Benutze derzeit PythonWin, meine so heißt das Teil!
Was mich daran stört ist, daß bei einem Punktoperator nicht wie bei C oder JAVA alle Funktionen erscheinen, die evt. genutzt werden können!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kalmuecke hat geschrieben:Ist das ein Editor??
Nein, das ist eine Shell. Ruf mal direkt python auf, dann kommst du in die Interaktive Python Shell, in der du Befehle eintippen kannst und die dann direkt ausgeführt werden. IPython ist auch so eine Shell nur eben "auf Crack", das heißt mit Farben und sehr vielen anderen Funktionen.
Kalmuecke hat geschrieben:Benutze derzeit PythonWin, meine so heißt das Teil!
PythonWin hat seine eigene Shell, die der normalen Shell von python sehr ähnlich ist.
Kalmuecke hat geschrieben:Was mich daran stört ist, daß bei einem Punktoperator nicht wie bei C oder JAVA alle Funktionen erscheinen, die evt. genutzt werden können!
Dann nutze doch PyDev für Eclipse, WingIDE, SciTE oder Vim (Vim kann das seit Version 7 glaube ich auch).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Kalmuecke
User
Beiträge: 6
Registriert: Freitag 6. Oktober 2006, 17:39

BlackJack hat geschrieben:
Wenn Du jetzt Objekte in einer Liste hast, dann kannst Du mit dem Index auf ein bestimmtes Objekt zugreifen und es an einen Namen binden:

Code: Alles auswählen

In [9]: a = ['x', 'y', 'z']

In [10]: b = a[1]

In [11]: b
Out[11]: 'y'
Kann man auf die Index auch "dynamisch" zugreifen, d.h. mit dem Zählerindex einer for-Schleife???
Bei kommt immer eine Fehlermeldung, daß der Index in Integer sein muss!
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Meinst du so?

Code: Alles auswählen

>>> x = 'Hallo'
>>> for i in range(5):
...   print x[i]
...
H
a
l
l
o
>>>
BlackJack

Kalmuecke hat geschrieben:
BlackJack hat geschrieben:
Wenn Du jetzt Objekte in einer Liste hast, dann kannst Du mit dem Index auf ein bestimmtes Objekt zugreifen und es an einen Namen binden:

Code: Alles auswählen

In [9]: a = ['x', 'y', 'z']

In [10]: b = a[1]

In [11]: b
Out[11]: 'y'
Kann man auf die Index auch "dynamisch" zugreifen, d.h. mit dem Zählerindex einer for-Schleife???
Bei kommt immer eine Fehlermeldung, daß der Index in Integer sein muss!
Irgendwie logisch oder? Die Meldung bedeutet das Du es mit etwas versuchst was keine Zahl ist. Ansonsten ist das natürlich kein Problem:

Code: Alles auswählen

In [1]: a = ['x', 'y', 'z']

In [2]: b = 1

In [3]: a[b]
Out[3]: 'y'
Mit einem Zählerindex aus einer ``for``-Schleife auf eine Liste zuzugreifen ist aber nicht besonders "pythonisch". Man kann auch direkt über die Liste iterieren:

Code: Alles auswählen

In [4]: for item in a:
   ...:     print item
   ...:
x
y
z
Und wenn man zusätzlich den Index braucht, dann gibt's die `enumerate()` Funktion:

Code: Alles auswählen

In [5]: for i, item in enumerate(a):
   ...:     print '%d. %s' % (i + 1, item)
   ...:
1. x
2. y
3. z
Antworten