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, beispielsweise ID
, Name
, Zip
und Phone
.
Der Code, den ich mir angesehen habe, hat mich dazu gebracht zu glauben, dass ich die jeweilige Spalte über die entsprechende Nummer aufrufen kann. Dh: Name
würde 2
entsprechen und jede Zeile mit row[2]
durchlaufen, würde alle Elemente in Spalte 2 erzeugen. t.
Folgendes habe ich bisher gemacht:
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 dadurch nur die spezifischen Spalten ausgedruckt werden, die ich für jede Zeile möchte, es sei denn, dies ist nicht der Fall.
Sie können die letzte Spalte nur mit diesem Code erhalten, wenn Sie Ihre Druckanweisung nicht in Ihre for
-Schleife einfügen.
Dies ist höchstwahrscheinlich das Ende Ihres Codes:
for row in reader:
content = list(row[i] for i in included_cols)
print content
Sie möchten es so sein:
for row in reader:
content = list(row[i] for i in included_cols)
print content
Nun, da wir Ihren Fehler beseitigt haben, möchte ich Ihnen jetzt das Modul pandas vorstellen.
Pandas ist spektakulär für den Umgang mit CSV-Dateien, und der folgende Code reicht aus, um eine CSV zu lesen und eine gesamte Spalte in einer Variablen zu speichern:
import pandas as pd
df = pd.read_csv(csv_file)
saved_column = df.column_name #you can also use df['column_name']
wenn Sie also alle Informationen in Ihrer Spalte Names
in einer Variablen speichern möchten, müssen Sie Folgendes tun:
names = df.Names
Es ist ein großartiges Modul, und ich schlage vor, Sie schauen sich das an. Wenn sich Ihre print-Anweisung aus irgendeinem Grund in for
-Schleife befunden hat und immer noch nur die letzte Spalte ausgedruckt hat, was nicht passieren sollte, sagen Sie mir bitte, ob meine Annahme falsch war. Ihr geposteter Code weist viele Einrückungsfehler auf, so dass es schwierig war zu wissen, was wo sein sollte. Hoffe das war hilfreich!
import csv
from collections import defaultdict
columns = defaultdict(list) # each value in each column is appended to a list
with open('file.txt') as f:
reader = csv.DictReader(f) # read rows into a dictionary format
for row in reader: # read a row as {column1: value1, column2: value2,...}
for (k,v) in row.items(): # go over each column name and value
columns[k].append(v) # append the value into the appropriate list
# based on column name k
print(columns['name'])
print(columns['phone'])
print(columns['street'])
Mit einer Datei wie
name,phone,street
Bob,0893,32 Silly
James,000,400 McHilly
Smithers,4442,23 Looped St.
Wird ausgegeben
>>>
['Bob', 'James', 'Smithers']
['0893', '000', '4442']
['32 Silly', '400 McHilly', '23 Looped St.']
Oder alternativ, wenn Sie die Spalten numerisch indizieren wollen:
with open('file.txt') as f:
reader = csv.reader(f)
reader.next()
for row in reader:
for (i,v) in enumerate(row):
columns[i].append(v)
print(columns[0])
>>>
['Bob', 'James', 'Smithers']
Um den Deliminator zu ändern, fügen Sie delimiter=" "
zur entsprechenden Instanziierung hinzu, d. H. reader = csv.reader(f,delimiter=" ")
.
Verwenden Sie pandas :
import pandas as pd
my_csv = pd.read_csv(filename)
column = my_csv.column_name
# you can also use my_csv['column_name']
Nicht benötigte Spalten zur Analysezeit verwerfen:
my_filtered_csv = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])
P.S. Ich fasse nur zusammen, was andere auf einfache Weise gesagt haben. Die tatsächlichen Antworten werden aus hier und hier entnommen.
Mit pandas können Sie den read_csv
mit dem Parameter usecols
verwenden:
df = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])
Beispiel:
import pandas as pd
import io
s = '''
total_bill,tip,sex,smoker,day,time,size
16.99,1.01,Female,No,Sun,Dinner,2
10.34,1.66,Male,No,Sun,Dinner,3
21.01,3.5,Male,No,Sun,Dinner,3
'''
df = pd.read_csv(io.StringIO(s), usecols=['total_bill', 'day', 'size'])
print(df)
total_bill day size
0 16.99 Sun 2
1 10.34 Sun 3
2 21.01 Sun 3
Sie können numpy.loadtext(filename)
verwenden. Zum Beispiel, wenn dies Ihre Datenbank ist .csv
:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | Adam | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Carl | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Adolf | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Den | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Und Sie möchten die Spalte Name
:
import numpy as np
b=np.loadtxt(r'filepath\name.csv',dtype=str,delimiter='|',skiprows=1,usecols=(1,))
>>> b
array([' Adam ', ' Carl ', ' Adolf ', ' Den '],
dtype='|S7')
Leichter können Sie genfromtext
verwenden:
b = np.genfromtxt(r'filepath\name.csv', delimiter='|', names=True,dtype=None)
>>> b['Name']
array([' Adam ', ' Carl ', ' Adolf ', ' Den '],
dtype='|S7')
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 manuell mit dem Standard-CSV-Modul erledigen. AFAIK, die einzigen Personen, die noch immer das csv-Modul verwenden, sind diejenigen, die noch keine besseren Werkzeuge für das Arbeiten mit Tabellendaten (Pandas, Petl usw.) gefunden haben Ihre Karriere aus verschiedenen fremden Quellen. Etwas wie Petl zu lernen, ist eine der besten Investitionen, die Sie machen können. Der Einstieg sollte nur 30 Minuten dauern, nachdem Sie pip install petl installiert haben. Die Dokumentation ist ausgezeichnet.
Antwort: Nehmen wir an, Sie haben die erste Tabelle in einer CSV-Datei (Sie können auch mit petl direkt aus der Datenbank laden). Dann würden Sie es einfach laden und folgendes tun.
from petl import fromcsv, look, cut, tocsv
#Load the table
table1 = fromcsv('table1.csv')
# Alter the colums
table2 = cut(table1, 'Song_Name','Artist_ID')
#have a quick look to make sure things are ok. Prints a nicely formatted table to your console
print look(table2)
# Save to new file
tocsv(table2, 'new.csv')
import pandas as pd
csv_file = pd.read_csv("file.csv")
column_val_list = csv_file.column_name._ndarray_values
Spaltenname abrufen, statt readlines () better use readline () zu verwenden, um zu vermeiden, dass die gesamte Datei wiederholt wird und die gesamte Datei gelesen und im Array gespeichert wird.
with open(csv_file, 'rb') as csvfile:
# get number of columns
line = csvfile.readline()
first_item = line.split(',')
Wenn Sie die Spalten separat bearbeiten müssen, zerstöre ich die Spalten gern mit dem Zip(*iterable)
-Muster (effektiv "entpacken"). Also für dein Beispiel:
ids, names, zips, phones = Zip(*(
(row[1], row[2], row[6], row[7])
for row in reader
))
Dank der Möglichkeit, einen Pandas-Datenrahmen zu indizieren und zu subsetieren, können Sie auf einfache Weise eine einzelne Spalte aus einer CSV-Datei in eine Variable extrahieren:
myVar = pd.read_csv('YourPath', sep = ",")['ColumnName']
Ein paar Dinge zu beachten:
Das obige Snippet erzeugt Pandas Series
und nicht dataframe
. Der Vorschlag von ayhan mit usecols
wird auch schneller sein, wenn Geschwindigkeit ein Problem darstellt. Das Testen der beiden verschiedenen Ansätze mit %timeit
auf einer Csv-Datei mit 2122 KB Größe 22.8 ms
für den usecols-Ansatz und 53 ms
für meinen vorgeschlagenen Ansatz.
Und vergessen Sie nicht import pandas as pd