eine Spalte aus Excel oder LibreOffice einlesen lassen

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
Fux
User
Beiträge: 10
Registriert: Donnerstag 10. August 2017, 16:15

Hallo,
Ich bin noch nicht sehr neu beim Programmieren und noch nicht besonders gut in Python , aber ich suche schon seit Stunden wie das Oben gennnte Thema funktioniert.

Code: Alles auswählen

if __name__ == "__main__":
        with open('mein dateiname', 'r') as f:
            print(f.read())
somit konnte ich die ganze Datei auslesen, aber wie bekomme ich jetzt nur eine bestimmte Spalte? :K
Zuletzt geändert von Anonymous am Samstag 12. August 2017, 14:09, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Im anderen Thema von Dir wurden doch `openpyxl` und `pandas` als Bibliotheken erwähnt.

Excel- oder LibreOffice-Tabellendokumente einfach 1:1 einzulesen und mit ``print`` auszugeben bringt nicht viel, denn das sind ja keine Textdateien. Man muss die Dateiformate schon kennen und entsprechend verarbeiten, beziehungsweise Bibliotheken/Module verwenden die das für einen erledigen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Fux hat geschrieben:aber ich suche schon seit Stunden wie das Oben gennnte Thema funktioniert.
Und Du hast bereits vor zwei Tagen 3 Antworten auf eine dahingehende Frage erhalten.

viewtopic.php?f=1&t=41053

Hast Du Dir nun die Openpyxl Bibliothek bereits angesehen und installiert oder zumindest einen Blick in die Dokumentation geworfen?
Fux
User
Beiträge: 10
Registriert: Donnerstag 10. August 2017, 16:15

Ja habe ich.
Bin damit aber nicht klar gekommen.
Ich habe dann aber unter Pandas was gefunden und gestern nach 6h doch noch herausgefunden wieso es nicht geht.
Ich habe einfach die for Schleife falsch aufgebaut. So wie ich es von Java gewohnt war.
Danke für die rasche antwort.
Fux
User
Beiträge: 10
Registriert: Donnerstag 10. August 2017, 16:15

Code: Alles auswählen

a = []
with open('dateiname.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter='\t')
    i=0
    for row in readCSV: 
        if i !=0:
            a.append(row[2])
        i=i+1
falls dieses Thema mal gesucht wird. So habe ich dass Problem mit dem einlesen gelöst.
Jeder fängt mal bei 0 an melewo ich würde nicht fragen wenn ich mich nicht wirklich damit beschäftigt hätte oder am verzweifeln bin.
Zuletzt geändert von Anonymous am Sonntag 13. August 2017, 12:06, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Fux: Da war das Fragen nach dem lesen einer Excel- oder LibreOffice-Datei aber irreführend wenn Du eigentlich eine CSV-Datei hast.

Das mit dem `i` ist unnötig umständlich. Man kann die erste Zeile einfach vor der Schleife mit `next()` auslesen und verwerfen, dann braucht man nicht bei jeder Zeile noch mal prüfen ob es nicht die erste ist.

Code: Alles auswählen

    with open('dateiname.csv') as csvfile:
        rows = csv.reader(csvfile, delimiter='\t')
        next(rows)  # Skip first row.
        column = []
        for row in rows:
            column.append(row[2])
Und jetzt wo da nichts mehr im Schleifenkörper ist als das `append()` mit einem einfachen Ausdruck um ein Element der Liste zu bestimmen, kann man das auch als „list comprehension“ schreiben.

Code: Alles auswählen

    with open('dateiname.csv') as csvfile:
        rows = csv.reader(csvfile, delimiter='\t')
        next(rows)  # Skip first row.
        column = [row[2] for row in rows]
Das man bei 0 anfängt ist ja kein Problem, aber wenn man zu einer Frage Antworten bekommt, und auf die dann nicht eingeht, sondern ein neues Thema mit der gleichen Frage eröffnet, fragt man sich halt wo bei den Antworten das Problem war.

Für CSV-Dateien hat auch `numpy` schon Funktionen zum Einlesen. Und `pandas` eben auch.
Fux
User
Beiträge: 10
Registriert: Donnerstag 10. August 2017, 16:15

Aaaa ok danke.
Fux
User
Beiträge: 10
Registriert: Donnerstag 10. August 2017, 16:15

Langsam komme ich rein. Ich habe mein Programm jetzt verbessert und vereinfacht.

Code: Alles auswählen

#Liest mir die Datei ein
df_1 = pd.read_csv("MeineDatei.csv", delimiter='\t')
# Gibt mir die gewünschten Spalten aus
df[['a', 'b']]
#Gibt die spalte aus und berechnet das vorkommen jedes Namen
df_1 = df.groupby(['a']).size()
# gibt mir mein Histogramm
df_1.plot.bar(legend='top_rigth', width = 0.5, color ='c');
Mich stört allerdings noch die x-Achse.
Die ganzen Namen, pro Balken , die unten aufgeführt wurden sind so zusammen gequetscht.
Weiß jemand wie ich das übersichtlicher machen kann?

Ich aber bereits einen zoom-Befehl eingebaut (s.h drunter), allerdings macht das blöderweise meine x-Achse noch unübersichtlicher .. :cry:

Code: Alles auswählen

import mpld3
mpld3.enable_notebook()
Und ich habe noch ein 2. Problem. Ich würde jetzt gerne 2 csv Dateien (eine spalte jeweils davon) vergleichen. Gibt es dafür einen konkreten befehl? oder irgendeinen Tipp?

Danke schon mal im vorraus :)
BlackJack

@Fux: Schau Dir das `legend`-Argument das Du da übergibst noch mal genau an: der Wert enthält einen Rechtschreibfehler.

Ohne Beispieldaten oder ein Bild ist mir nicht so ganz klar was das Problem mit der X-Achse ist. Die Werte werden ja bereits um 90° gedreht angezeigt, oder?

Was heisst Spalten vergleichen? Wenn es Zahlen sind, kann man beispielsweise die Spalten voneinander abziehen und das Ergebnis plotten oder statistisch auswerten. Falls es Text ist, und Du ein „diff“ haben möchtest, schau Dir mal das `difflib`-Modul aus der Standardbibliothek an.
Fux
User
Beiträge: 10
Registriert: Donnerstag 10. August 2017, 16:15

Oh danke, dass habe ich gar nicht gesehen.
Wie kann man hier ein Bild einfügen, dann würde ich es hier zeigen.
Falls das nicht geht, also jeder Balken auf der x-Achse hat einen Namen, da es sooo viele Balken sind und die x-Achso sehr kurz(klein).
Kann man die Namen nicht mehr lesen, da sie sich überschneiden und auch sehr klein sind...

Es sind spalten , gefüllt mit Namen . Danke ich schau mir dass mal genauer an :)
BlackJack

@Fux: Bilder kann man hier nur einfügen wenn sie irgendwo im Netz verfügbar sind. Also zum Beispiel auf einem der Image-Hoster die externes einbinden von Bildern erlauben. Imgur.com wäre eine Möglichkeit.

Wenn der Platz auf der X-Achse nicht reicht und noch weiteres verkleinern keine Option ist, müsste man die Seitenverhältnisse des Diagramms ändern, so das mehr nebeneinander passt.

Vielleicht muss man ja auch nicht alle Werte anzeigen, sondern könnte auch die mit den höchsten Werten anzeigen und den Rest unter „Sonstige“ zusammenfassen. Das kommt letztlich darauf an was Du mit so einem Diagramm sagen/zeigen möchtest.
Fux
User
Beiträge: 10
Registriert: Donnerstag 10. August 2017, 16:15

Ja eher das erste also Seitenverhältnisse anpassen.
Wie geht denn dass? Ich habe nichts gefunden im internet oder es übersehen.

und pip install difflib funktioniert nicht
npm install difflib leider auch nicht gibt es noch eine Möglichkeit?
BlackJack

@Fux: `difflib` ist in der *Standardbibliothek*. Das musst Du nicht extra installieren. Und ``npm`` ist der Package-Manager von Node.js, damit kann an nichts für Python installieren.
Fux
User
Beiträge: 10
Registriert: Donnerstag 10. August 2017, 16:15

Eine weitere Frage:
Ich mache jetzt immer wieder kleine Verbesserungen an meinen Barplots.
Allerdings passt mir die x-Achse noch nicht. Ich würde jetzt gerne die Skalierung kürzen.
Ich habe bereits im internet gesucht und selbst einiges ausprobiert.
Entweder hängt es immer an einer Kleinigkeit oder ich wende es falsch an.

Ich hätte gerne eine Skalierung von 0-100 an der x- Achse aber ohne die y-Achse zu ändern

1. Versuch:
ax1.set_title(s_id).update({'color':'black', 'size':5, 'family':'monospace'})
ax1.set_xlabel('').linepsace(0, 10, 100) #geht nicht

2.Versuch:
b = sns.barplot(x = df_2['co'] , y = df_2['hi'], ax=ax1, orient='h')
ax1.set_title(s_id).update({'color':'black', 'size':5, 'family':'monospace'})
ax1.set_xlabel(' ')
ax1.set_ylabel(' ')
plt.axis([ 0, 100, min(y) ,max(y) ]) # geht nicht

...

kann mir jemand sagen was ich falsch mache? :K
Danke im voraus
Antworten