it-swarm.com.de

Bestimmte Spalten aus einer CSV-Datei mit CSV-Modul lesen?

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.

130
frankV

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!

147
Ryan Saxe
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=" ").

91
HennyH

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.

16
VasiliNovikov

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
13
ayhan

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')
13
G M

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')
4
PeteBeat
import pandas as pd 
csv_file = pd.read_csv("file.csv") 
column_val_list = csv_file.column_name._ndarray_values
1
Hari K

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(',')
0
Suren

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
))
0
Robert Jensen

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

0
vestland