Seite 1 von 1

Listelemente in String wandeln

Verfasst: Freitag 6. Oktober 2006, 17:51
von Kalmuecke
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

Verfasst: Freitag 6. Oktober 2006, 22:17
von Kalmuecke
Keiner eine Idee!

Re: Listelemente in String wandeln

Verfasst: Samstag 7. Oktober 2006, 00:42
von 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.

Verfasst: Samstag 7. Oktober 2006, 18:33
von Kalmuecke
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 ":" ???

Verfasst: Samstag 7. Oktober 2006, 19:38
von Leonidas
Kalmuecke hat geschrieben:
Out[11]: 'y'
Was bedeutet denn nun der ":" ???
Das ist nur die Ausgabe der verbesseren Python-Shell, IPython.

Verfasst: Samstag 7. Oktober 2006, 20:08
von Kalmuecke
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!

Verfasst: Samstag 7. Oktober 2006, 20:17
von Leonidas
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).

Re: Listelemente in String wandeln

Verfasst: Montag 9. Oktober 2006, 08:18
von Kalmuecke
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!

Verfasst: Montag 9. Oktober 2006, 09:32
von Nirven
Meinst du so?

Code: Alles auswählen

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

Re: Listelemente in String wandeln

Verfasst: Montag 9. Oktober 2006, 13:38
von 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