Ich versuche, eine CSV-Datei zu analysieren und die Daten nur aus bestimmten Spalten zu extrahieren.
Beispiel csv:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Ich versuche nur bestimmte Spalten zu erfassen, sagen ID
, Name
, Zip
und Phone
.
Der Code, den ich mir angesehen habe, hat mich zu der Annahme geführt, dass ich die spezifische Spalte mit der entsprechenden Nummer aufrufen kann, dh: Name
würde 2
jeder Zeile entsprechen und durchlaufen, wobei row[2]
alle Elemente in Spalte 2 erzeugt würden. Nur nicht.
Folgendes habe ich bisher getan:
import sys, argparse, csv
from settings import *
# command arguments
parser = argparse.ArgumentParser(description='csv to postgres',\
fromfile_prefix_chars="@" )
parser.add_argument('file', help='csv file to import', action='store')
args = parser.parse_args()
csv_file = args.file
# open csv file
with open(csv_file, 'rb') as csvfile:
# get number of columns
for line in csvfile.readlines():
array = line.split(',')
first_item = array[0]
num_columns = len(array)
csvfile.seek(0)
reader = csv.reader(csvfile, delimiter=' ')
included_cols = [1, 2, 6, 7]
for row in reader:
content = list(row[i] for i in included_cols)
print content
und ich erwarte, dass dies nur die spezifischen Spalten druckt, die ich für jede Zeile haben möchte, außer es nicht, ich bekomme nur die letzte Spalte.
'rb'
markierenopen()
? sollte es nicht einfach seinr
?"rb"
ist es geeignet, an zu übergebencsv.reader
.Antworten:
Die letzte Möglichkeit, die letzte Spalte aus diesem Code zu erhalten, besteht darin, dass Sie Ihre print-Anweisung nicht in Ihre
for
Schleife aufnehmen.Dies ist höchstwahrscheinlich das Ende Ihres Codes:
Du willst, dass es so ist:
Nachdem wir Ihren Fehler behandelt haben, möchte ich mir diese Zeit nehmen, um Ihnen das Pandas- Modul vorzustellen .
Pandas ist spektakulär für den Umgang mit CSV-Dateien. Der folgende Code reicht aus, um eine CSV-Datei zu lesen und eine ganze Spalte in einer Variablen zu speichern:
Wenn Sie also alle Informationen in Ihrer Spalte
Names
in einer Variablen speichern möchten, müssen Sie Folgendes tun:Es ist ein großartiges Modul und ich schlage vor, dass Sie es sich ansehen. Wenn Ihre print-Anweisung aus irgendeinem Grund in einer
for
Schleife war und immer noch nur die letzte Spalte ausgedruckt wurde, was nicht passieren sollte, aber lassen Sie mich wissen, wenn meine Annahme falsch war. Ihr geposteter Code weist viele Einrückungsfehler auf, sodass es schwierig war zu wissen, was wo sein sollte. Hoffe das war hilfreich!quelle
Mit einer Datei wie
Wird ausgegeben
Oder alternativ, wenn Sie eine numerische Indizierung für die Spalten wünschen:
Um den Begrenzer zu ändern, fügen Sie
delimiter=" "
der entsprechenden Instanziierung hinzu, d. H.reader = csv.reader(f,delimiter=" ")
quelle
Verwenden Sie Pandas :
Verwerfen Sie nicht benötigte Spalten zur Analysezeit:
PS Ich fasse nur zusammen, was andere auf einfache Weise gesagt haben. Aktuelle Antworten finden Sie hier und hier .
quelle
Mit Pandas können Sie verwenden ,
read_csv
mitusecols
Parametern:Beispiel:
quelle
Sie können verwenden
numpy.loadtext(filename)
. Zum Beispiel, wenn dies Ihre Datenbank ist.csv
:Und du willst die
Name
Spalte:Einfacher können Sie verwenden
genfromtext
:quelle
Kontext: Für diese Art von Arbeit sollten Sie die erstaunliche Python-Petl-Bibliothek verwenden. Das erspart Ihnen viel Arbeit und potenzielle Frustration, wenn Sie die Dinge mit dem Standard-CSV-Modul „manuell“ ausführen. AFAIK, die einzigen Personen, die das CSV-Modul noch verwenden, sind diejenigen, die noch keine besseren Tools für die Arbeit mit tabellarischen Daten (Pandas, Petl usw.) entdeckt haben. Dies ist in Ordnung, aber wenn Sie vorhaben, mit vielen Daten in zu arbeiten Ihre Karriere aus verschiedenen seltsamen Quellen, etwas wie petl zu lernen, ist eine der besten Investitionen, die Sie tätigen können. Der Einstieg sollte nur 30 Minuten dauern, nachdem Sie petl petl installiert haben. Die Dokumentation ist hervorragend.
Antwort: Angenommen, Sie haben die erste Tabelle in einer CSV-Datei (Sie können sie auch mit petl direkt aus der Datenbank laden). Dann würden Sie es einfach laden und Folgendes tun.
quelle
quelle
pip install pandas
zuerstIch denke, es gibt einen einfacheren Weg
Also hier
iloc[:, 0]
,:
bedeutet , dass alle Werte,0
die Stellung der Säule. im folgenden BeispielID
wird ausgewähltquelle
Dank der Art und Weise, wie Sie einen Pandas-Datenrahmen indizieren und unterteilen können, können Sie eine einzelne Spalte aus einer CSV-Datei ganz einfach in eine Variable extrahieren:
Ein paar Dinge zu beachten:
Das obige Snippet erzeugt einen Pandas
Series
und nichtdataframe
. Der Vorschlag von Ayhan mitusecols
wird auch schneller sein, wenn Geschwindigkeit ein Problem ist. Das Testen der beiden unterschiedlichen Ansätze unter Verwendung%timeit
einer22.8 ms
CSV- Datei mit einer Größe von 2122 KB ergibt den usecols-Ansatz und53 ms
meinen vorgeschlagenen Ansatz.Und vergiss nicht
import pandas as pd
quelle
Wenn Sie die Spalten separat verarbeiten müssen, möchte ich die Spalten mit dem
zip(*iterable)
Muster zerstören (effektiv "entpacken"). Also für Ihr Beispiel:quelle
Abzuholen Spaltennamen , anstelle der Verwendung von Leseleitungen () eine bessere Nutzung Readline- () zu vermeiden Loop & das komplette Datei Lesen & sie in dem Array gespeichert werden .
quelle