Aus csv importiere Daten in Phyton anzeigen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Kaffeetasse
User
Beiträge: 2
Registriert: Mittwoch 19. Februar 2020, 15:07

Hallo zusammen

Ich möchte importierte daten ausgeben. Ich schreibe "print(data)"

Folgendes wird ausgegeben:

Code: Alles auswählen

                 Average.disposable.income  ...  Liking.school
Australia                        20.813221  ...            NaN
Austria                          22.162446  ...           38.1
Belgium                          21.401153  ...           21.6
Canada                           25.606245  ...           29.5
Czech Republic                   10.849270  ...           11.7
Denmark                          23.175894  ...           25.6
Finland                          22.027651  ...           16.1
France                           18.960382  ...           21.4
Germany                          19.894067  ...           34.9
Greece                           17.183647  ...           25.6
Hungary                           9.463130  ...           27.6
Iceland                          22.286852  ...           36.6
Ireland                          22.364689  ...           24.0
Italy                            17.180761  ...           12.8
Japan                            22.479705  ...            NaN
Korea                            21.651918  ...            NaN
Luxembourg                       34.241822  ...           20.7
Mexico                            5.335074  ...            NaN
Netherlands                      25.041012  ...           39.7
New Zealand                      17.197108  ...            NaN
Norway                           28.574371  ...           41.7
Poland                            7.939399  ...           21.1
Portugal                          3.839462  ...           22.8
Slovak Republic                   7.797596  ...           13.0
Spain                            16.430249  ...           23.9
Sweden                           19.916998  ...           24.1
Switzerland                      24.651815  ...           27.3
Turkey                            5.071860  ...           57.4
United Kingdom                   22.697062  ...           35.7
United States                    29.196531  ...           26.4

[30 rows x 21 columns]
       Average.disposable.income  ...  Liking.school
count                  30.000000  ...       25.00000
mean                   18.847713  ...       27.17200
std                     7.597219  ...       10.39926
min                     3.839462  ...       11.70000
25%                    16.617877  ...       21.40000
50%                    21.107187  ...       25.60000
75%                    22.642722  ...       34.90000
max                    34.241822  ...       57.40000

[8 rows x 21 columns]
Hiervon sind aber etliche daten verschwunden, siehe "..."

Wie kann ich die dennoch ausgeben?

Selbes Problem bei

data. describe()

Besten dank für eure antworten.

(komplett neu in der phyton welt :-|)
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kaffeetasse: Das sieht nach Pandas aus. Schau Dir mal `set_option()` an.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Kaffeetasse
User
Beiträge: 2
Registriert: Mittwoch 19. Februar 2020, 15:07

besten dank, hat funktioniert mit
import pandas as pd
"pd.options.display.max_columns = 999"
pUC19
User
Beiträge: 13
Registriert: Donnerstag 19. September 2019, 14:33

Hallo zusammen. Ich habe folgendes Problem. Ich möchte alle im Verzeichnis vorhandene CSV Datei lesen, diese bearbeiten und dann in ein anderes Verzeichnis abspeichern. Kann mir da jemand helfen?

from sys import exit
import os
import csv
import datetime
from pathlib import Path
#from pprint import pprint
from tkinter import filedialog
#import tkinter.messagebox
now = datetime.datetime.now()

# Define some fixed strings
fixed_four_dot_zero = '.4,0'
fixed_uni = 'Universität Regensburg;Unistr. 31;93053;Regensburg;Warenannahme'
fixed_100_percent = '100.00'
fixed_nineteen = '19.00'
fixed_stk = 'Stk'
fixed_email = 'email@ur.de'
fixed_Sachbearbeiter = '13866'
# empty output, will be written to file
output = []
skipped = 0
output_row = []

#-------Such aus dem Verzeichnis alle CSV Datein-------#
directory = os.path.join("/sdcard/Python/Tkinterdb")
for root,dirs,files in os.walk(directory):
for file in files:
if file.endswith(".csv"):
filename1 = open(file,"r")
print(file)

input_file_name = str(filename1)
csv_input_file = os.path.join(directory)
output_file_name = str(filename1)
csv_output_file = os.path.join("/sdcard/Python/Tkinterdb/out", output_file_name)


for r, row in enumerate(input_file_name):
if len(row) not in [14, 13]: #[16,13]
skipped += 1

name_parts = row[1].split(",")
name = name_parts[1].strip() + " " + name_parts[0]
if r == 0:
output_row.append('(' + row[0] + fixed_four_dot_zero + ')')
output_row.append(row[12] + ';' + fixed_Sachbearbeiter + ';' + fixed_uni + ';' + row[13] + ';' + row[14]) #name an zweiter Stelle geändert duch fixed_Sachbearbeiter
output_row.append(name + ';' + row[2] + ';' + row[3] + ';' + fixed_email) #row[14] vorher 15
output_row.append(';;;')
output_row.append(
str(now.year) + ';' + row[4] + ';' + row[5] + ';;' + row[6] + ';' + row[7] + ';;;' + fixed_100_percent)
output_row.append(row[8] + ';' + row[9] + ';' + row[10] + ';' + fixed_stk + ';' + row[11] + ';' + fixed_nineteen)
output.append(output_row)
print(outpit)
if skipped >= 0:
with open(csv_output_file, 'w', encoding='utf8') as f:
for row in list(output):
for row_part in list(row):
f.write(row_part + '\n')



Die Datei schaut so aus.

"15383","Name, Name","2539","2474","01521","54791","9109384","11040451","Impfschlinge 10 Mikro , steril, wei�, zu 48","46.4","1","86.1567.050","63","Lagerbestand","Name"
"15384","Name, Name","2539","2474","01521","54791","9109384","11040451","Reagiergef��, 0,5 ml","68.4","2","72.699","63","Lagerbestand","Name"
"15385","Name, Name","2539","2474","01521","54791","9109384","11040451","Pipettenspritze 2 - 200�l","33.9","9","70.760.502","63","Lagerbestand","Name"
"15386","Name, Name","2539","2474","01521","54791","9109384","11040451"," Pipettenspitze blau 1000 �l","23.7","10"," 70.762.100","63","Lagerbestand","Name"
"15387","Name, Name","2539","2474","01521","54791","9109384","11040451","Pipettenspitze,farblos, 10 mikro","47.7","9","70.1130.600","63","Lagerbestand","Name"


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

@pUC19: Warum kaperst Du einen Thread zu einem ganz andren Thema, statt einen neuen aufzumachen?
Warum importierst Du pathlib und nutzt es dann gar nicht? Statt Strings mit split und + zu verarbeiten solltest du dir das csv-Modul anschauen. Das Encoding Deiner Inputdatei stimmt nicht.
Und weil ist jetzt Deine konkrete Frage? Was genau tut nicht so wie Du willst?
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pUC19: Bei den Import-Zeilen ist jede zweite Zeile eine die etwas importiert was gar nicht verwendet wird. Nettes Muster. Absicht? Warum?

Wobei mir scheint, dass das `csv`-Modul sinnvoll wäre wenn man es denn tatsächlich benutzen würde.

Auf Modulebene solle nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Konstanten werden per Konvention KOMPLETT_GROSS geschrieben. Das betrifft die ganzen `fixed_*`-Namen am Anfang. Wobei man dann in Frage stellen sollte was der `fixed_`-Präfix bedeuten soll. Das sich die Werte nicht ändern, also die Namen nicht an andere Werte gebunden werden sollen? Das wird ja dann schon durch die Schreibweise als Konstante deutlich. Genau deswegen macht man das ja so.

`fixed_nineteen` kommt mir als Name komisch vor. Das ist doch hoffentlich nicht der Mehrwertsteuersatz? Wenn sich der ändert, muss man ja beides anpassen, den Wert und den Namen. Das macht irgendwie den Vorteil von einer Konstanten zunichte das man im Falle einer Änderung nur eine Stelle im Programm anpassen muss. Bei Namen ist ja für den Leser interessant was der Wert dahinter bedeutet, nicht das man den Wert selbst noch mal im Namen wiederholt.

`output`, `output_row`, und `skipped` werden nur ein einziges mal initialisiert für alle Dateien die da verarbeitet werden. Das ist ziemlich sicher falsch.

`os.path.join()` mit nur einem Argument macht keinen Sinn. Den Basispfad würde man auch besser als Konstante definieren, denn das ist auch eine Information die man nur an einer Stelle im Code haben möchte, um sie leicht anpassen zu können. In neuem Code würde ich das gleich als `Path`-Objekt machen.

Nachdem klar ist, dass es sich um einen Dateinamen handelt der mit ".csv" endet wird es ziemlich wirr und ich denke dieser ganze Code lief nie auch nur ansatzweise. Du nennst den Dateinamen `file` und das Dateiobjekt dann `filename1` — warum auch immer da eine sinnlose 1 dran hängt ist das extrem verwirrend die Objekte genau entgegengesetzt dem zu bennenen was sie eigentlich sind.

Und dann nennst Du eine Zeichenkettendarstellung eines Dateiobjekts `input_file_name` was weder Sinn macht — mit der Zeichenkettendarstellung eines Dateiobjekts kann man nichts sinnvolles machen — noch inhaltlich zu dem Namen passt.

Dann wird auf den Pfadnamen auf den schon mal sinnlos `os.path.join()` angewendet wurde, noch mal sinnlos `os.path.join()` angewendet. Der Name an den das Ergebnis gebunden wird, wird aber danach nirgends mehr verwendet. Warum also überhaupt diese Zeile?

Danach wird dann das gleiche Dateiobjekt wieder in eine Zeichenkette umgewandelt und an den Namen `output_file_name` gebunden. Wir haben dann also die gleiche sinnfreie Zeichenkette an die Namen `input_file_name` und `output_file_name` gebunden. Selbst wenn das Dateiobjekte wären kann eine Textdatei nicht gleichzeitig Ein- und Ausgabedatei sein, ausser in recht exotischen Sonderfällen, nämlich wenn sich an den Zeilenlängen nichts ändert. Und man muss die Datei dann auch in einem entsprechenden Modus öffnen. Aber wie gesagt, das geht sowieso nicht wirklich im allgemeinen Fall.

Die Dateien die da geöffnet werden, werden in dem Code nirgends geschlossen. Du baust da auf das implizite Schliessen wenn die Speicherbereinigung das Dateiobjekt abräumt, da gibt es aber keine Zusagen *wann* das passiert. Falls es also genug Dateien gibt, kann man so die Anzahl der Dateihandles die das Betriebssystem dem Prozess zugesteht aufbrauchen und das Programm bricht deswegen mit einem Fehler ab. Wo möglich sollte man die ``with``-Anweisung verwenden um die Ressource Datei zu verwalten. Beim schreiben machst Du das ja auch.

Bei Textdateien sollte man immer explizit eine Kodierung beim öffnen angeben. Auch das machst Du beim Schreiben, aber nicht beim Lesen.

Namen sollte man nicht zu weit von der Verwendung an Namen binden. `csv_output_file` wird sehr weit von der Stelle entfernt definiert an der es dann letztendlich verwendet wird. Es wird sogar definiert wenn es am Ende gar nicht verwendet wird.

Man kann an dem fehlerhaften Code jetzt nicht erkennen wie die Zieldatei genau heissen soll, aber es wäre besser wenn die nicht auf ".csv" endet weil das Zielverzeichnis in dem Verzeichnis liegt welches das Programm rekursiv nach ".csv"-Dateien durchsucht. Das findet dann ja auch Dateien die es selbst gerade eben dort abgelegt hat oder in einem früheren Durchlauf. Da bekommt man dann Probleme wenn versucht wird eine verarbeitete Datei noch mal zu verarbeiten.

`enumerate()` zu verwenden um die erste Zeile anders als die anderen zu behandeln ist wahrscheinlich nicht sinnvoll. Aus dem Code wird nicht klar was da tatsächlich passieren soll, weil das alles nicht wirklich Sinn ergibt, aber meistens kann man die erste Zeile einfach vor der Schleife behandeln.

Falls der Code bis in die letzte Zeile der Schleife kommt, ist da ein offensichtlicher `NameError` weil `outpit` nicht definiert ist.

`list()` mit `output` und `row` aufzurufen macht keinen Sinn. Das sind bereits Listen, wobei ``for`` ja noch nicht einmal eine Liste braucht.

Wenn man sich das Schreiben anschaut, dann macht `output_row()` davor keinen Sinn, selbst wenn diese Liste nicht nur immer grösser und grösser werden würde mit jeder Eingabezeile ehthält die ja nicht eine Zeile sondern mehrere.

Es liegt in der Herangehensweise IMHO schon ein Problem. Das ist ein riesiger Haufen Code am Stück an dem viel zu viel nicht funktioniert. Soweit sollte es bei der Programmentwicklung gar nicht erst kommen. Man zerlegt das Problem in Teilprobleme und die wieder in Teilprobleme, solange bis man einzelne Teilprobleme mit jeweils einer Funktion mit ein paar Zeilen Code lösen kann. Das macht man dann und testet die Funktion/Teillösung ob sie das tut was sie soll. Und man macht erst mit der nächsten Funktion weiter wenn das der Fall ist. So setzt man dann nach und nach die Teillösungen zu grösseren Teillösungen zusammen, bis man das Gesamtproblem gelöst hat. Auf die Weise hat man immer funktionsfähigen Code oder zumindest welchen bei dem immer nur ein kleiner Teil ungetestet und fehlerbehaftet ist.

Eine Grundaufteilung die sich oft anbietet ist Eingabe, Verarbeitung, und Ausgabe zu trennen. Also beispielsweise eine Funktion die eine Datei in eine geeignete Datenstruktr lädt. Eine Funktion die aus der Struktur eine erstellt die sich zum Schreiben in die Ergebnisdatei eignet. Und eine Funktion, welche die Ergebnisdatenstruktur dann in eine Datei schreibt. Diese drei Funktionen kann man dann in einer Funktion verwenden die eine Datei umwandelt.

Das umwandeln von Eingabedatensätzen in Ausgabedatensätze kann man in der Regel auf das Umwandeln *eines* Eingabedatensatzes in *einen* Ausgabedatensatz herunterbrechen. Wenn man so eine Funktion hat die *einen* Datensatz umwandelt, kann man diese Funktion einfach nacheinander auf alle Eingabedatensätze anwenden.

Das Ermitteln der Dateien die verarbeitet werden müssen kann man auch in eine Funktion stecken.

Für den Anfang lieber ein paar Funktionen zu viel als zu grosse Funktionen die man irgendwann nicht mehr beherrscht/überblickt. Kleine Funktionen die getestet sind, also funktionieren, zusammenfassen, ist einfacher als sich mit wachsenden Funktionen herumzuschlagen und die in Kleinere aufzuteilen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
pUC19
User
Beiträge: 13
Registriert: Donnerstag 19. September 2019, 14:33

Hi, vielen Dank für die Verbesserungsvorschläge. Ich wusste nicht, wie ich ein neues Thema eröffnen, daher habe ich ein ähnliches genommen.

Der Python Code an sich habe ich viele Male umgeändert. Ursprüngliche lief er als tkinter und hat auch das gemacht was es soll. Des wegen sind in dem Code noch Elemente enthalten, die nicht dazu gehören. Sorry. Selber bin ich nur ein Anfänger und habe die Aufgabe, dieses Programm bis Mittwoch fertig zustellen.

@blackjack: Ich werde mich heute dran machen alle deine Ansätze abzuarbeiten. Vielen lieben Dank.
Antworten