List in txt speichern ohne klammern anführungszeichen ...

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
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Hallo

Ich will eine Liste von Werten in eine txt Datei Speichern dies erreiche ich mit den folgenden Code

Code: Alles auswählen


        Zeitpunkt.append(time.strftime("%Y%m%dT%H%M%S"))
        Wert1.append(x)
        ...

        Result = zip(Zeitpunkt, Wert1,  Wert2, Wert3, Wert4)

        dataFile = open(outFileName+ id + '.txt','w')
        #for eachitem in Resulttitle:
        #    dataFile.write(str(eachitem)+'\n')
        for eachitem in Result:
            dataFile.write(str(eachitem)+'\n')
        dataFile.close()

Allerdings habe ich nun das Problem, das jede Zeile in der txt mit einer Klammer ( beginnt und mit ) endet.
und der zeitpunkt zusätzlich noch mit ' Anführungszeichen geschrieben ist.
z.B.

('20150226T074750', 40147357696)
('20150226T074752', 40338903040)
...
Wie kann ich die Zeichen (,),' aus der txt entfernen bzw. bei der Entstehung bereits verhindern
Wäre über Tips dankbar

Viele Grüße

Sbfly
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@sbfly: die String-Repräsentation von Objekten wie Listen und Tuple sind nicht für die Weiterverwendung gedacht, sondern nur für Debug-Ausgaben. Wahrscheinlich möchtest Du eine csv-Datei schreiben, dafür gibt es das csv-Modul.
Statt die Werte in 5 verschiedenen Listen zu sammeln, solltest Du gleich von Anfang an nur eine Liste mit 5-Tuple-Einträgen erzeugen, statt sie zum Schluß über zip wieder zusammenzuführen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du könntest das ``csv``-Modul nutzen, um eine CSV Datei zu erzeugen.

Edit: Und schon wieder zweiter... :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

vielen Dank werde ich gleich mal versuchen
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Hallo

ich habe mit das CSV modul mal etwas angeschaut https://docs.python.org/2/library/csv.html und auch versucht umzusetzen
Leider funktioniert es nicht so ganz.

Code: Alles auswählen

with open('test1.csv', 'a') as csvfile:
            fieldnames = ['Zeit', 'Wert1', 'Wert2']
            writer = csv.DictWriter(csvfile,fieldnames=fieldnames)
            writer.writeheader()
            writer.writerow({'Zeit':time.strftime("%Y%m%dT%H%M%S"), 'Wert1' : Wert1, Wert2 : Wert2})
Als Fehlermeldung erhalte ich folgendes
AttributeError: DictWriter instance has no attribute 'writeheader'

Hat jemand einen kurzen Tip woran das liegen könnte?

Vielen Dank

Florian
Zuletzt geändert von Anonymous am Freitag 27. Februar 2015, 09:12, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@sbfly: welche Pythonversion verwendest Du? writeheader gibt es 'erst' ab Python 2.7/3.2. In Deinem Fall würde ich aber wohl gar keine Dictionaries benutzen sondern nur Listen und den normalen writer.
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Ich verwende python 2.7

habe nun irgendwas geändert und es geht weiss nur nicht was :-)
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

nochals nee kleine Frage

ich benutze

Code: Alles auswählen

CPU=psutil.cpu_percent( interval=1, percpu=True)
um mir die Auslastung der einzelnen CPU cores mit auszugeben
nun würde ich gern diese Werte auch in die CSV Datei Speichern da es sich dabei um eine liste handelt
wird in meiner CSV immer die CPU Werte mit "[ und ]" eingefügt.
also "[0.0, 0.0, 0.0, 0.0]"
die Klammer konnte ich mit folgendem befehl entfernen

Code: Alles auswählen

str(cpu_all).strip('[]')
Ab wie kann ich noch die Anführungszeichen ("") entfernen ?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Indem du aus der Liste erst gar keinen String machst und diese Liste direkt mit dem csv-Modul speicherst. Du solltest dich unbedingt mit Datentypen befassen.
Das Leben ist wie ein Tennisball.
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

aber die Ausgabe von dem psutil ist bereits in diesem Format

"[0.0,0.0,0.0,0.0]"

und an der psutil ausgabe kann ich glaube nichts ändern
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

Mal abgesehen davon, dass CSV eine feine Lösung ist könnte man dieses Problem auch ohne dieses Modul lösen. Wenn du dir in deinem ursprünglichen Code vor deinen ".write" Befehl einen "print type(eachitem)" einfügst wirst du sehen, dass du in deiner Liste ein Tuple hast, durch das du entweder nochmals iterieren musst oder per Index auf die Elemente zugreifst(wenn dir die Datenstruktur bekannt ist).
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Lass dir mal den Typ des Rückgabewerts von psutil.cpu_percent ausgeben.
Das Leben ist wie ein Tennisball.
BlackJack

@sbfly: `psutil` liefert nichts mit Klammern oder Anführungszeichen zurück bei dem Aufruf, sondern eine Liste mit Gleitkommazahlen. Eine Zeichenkette mit Klammern bekommst Du erst wenn *Du* diese Liste in eine Zeichenkettendarstellung umwandelst. Und die Anführungszeichen erst wenn Du diese Zeichenkettendarstellung *noch mal* in eine Zeichenkettendarstellung einer Zeichenkette umwandelst. Lass das einfach bleiben und schon sind da weder Klammern noch Anführungszeichen.

Edit: Die Anführungszeichen könnten auch beim Speichern in CSV vom `csv`-Modul eingefügt werden wenn das Trennzeichen das Komma ist. Dann muss man ja schliesslich irgendwie unterscheiden können ob ein Komma zum Wert gehört oder als Trennzeichen zwischen Werten interpretiert werden muss.
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Hallo ja die Klammern entstehen beim speichern in CSV

nun habe ich folgendes versucht:

Code: Alles auswählen

	cores = multiprocessing.cpu_count()
	for i in range(cores):
		fields_cpu.append('CPU_'+str(i+1))
		fields_old =['Zeit', 'Wert1', 'Wert2', 'Wert3']
		field_complete= fields_old+fields_cpu
		fields_title= dict(zip(field_complete,field_complete))

        with open(args.output_path+args.NameP +'.csv', 'w') as csvfile:
               writer = csv.DictWriter(csvfile,delimiter=',',fieldnames=field_complete) 
               writer.writerow(fields_title)
und in meiner Schleife folgendes

Code: Alles auswählen

with open(args.output_path+args.NameP +'.csv', 'a') as csvfile:
            writer = csv.DictWriter(csvfile,delimiter=',',fieldnames=field_complete) 
            csv_line = [time.strftime("%Y%m%dT%H%M%S"), str(int(Wert1)), str(int(Wert2)), str(int(Wert3))] +  cpu_load
            row = dict(zip(fieldnames, csv_line))
            writer.writerow(row)

Leider funktioniert dies nicht :(
nicht einmal die erste Zeile aus dem ersten with open wird mir in der Datei ausgegeben
Hat jemand einen Tip
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@sbfly: Du machst in Deiner for-Schleife unnötiges Zeugs. Dateinamen sollten nicht mit + zusammengestückelt werden, dafür gibt es os.path.join. Auch sollte der Dateiname nur einmal ermittelt werden und nicht bei jedem open erneut. csv-Dateien sind ja gerade dafür da, auch Zahlen speichern zu können, das Umwandeln in str und wahrscheinlich auch in int ist unnötig.
Wenn writerow ausgeführt wird, steht auch etwas in der Datei. Schaust Du auch in die richtige Datei am richtigen Ort?
Antworten