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, z. B. 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 entsprechen und jede Zeile mit row[2] durchlaufen Produzieren Sie alle Elemente in Spalte 2. 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.

184
frankV 12 Mai 2013 im 06:10

11 Antworten

Beste Antwort

Die letzte Möglichkeit, die letzte Spalte aus diesem Code zu erhalten, besteht darin, dass Sie Ihre print-Anweisung nicht in Ihrer 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

Du willst, dass es so ist:

for row in reader:
        content = list(row[i] for i in included_cols)
        print content

Nachdem wir Ihren Fehler behandelt haben, möchte ich Ihnen 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:

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, dass Sie es sich ansehen. Wenn sich Ihre print-Anweisung aus irgendeinem Grund in der for -Schleife befand und immer noch nur die letzte Spalte ausgedruckt wurde, was nicht passieren sollte, 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!

173
Ryan Saxe 12 Mai 2013 im 03:06
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 eine numerische Indizierung für die Spalten wünschen:

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 Begrenzer zu ändern, fügen Sie delimiter=" " zur entsprechenden Instanziierung hinzu, d. H. reader = csv.reader(f,delimiter=" ")

103
icedwater 23 März 2014 im 16:34

Mit Pandas können Sie read_csv mit dem Parameter usecols:

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
18
ayhan 6 Dez. 2016 im 20:26

Sie können numpy.loadtext(filename) verwenden. Zum Beispiel, wenn dies Ihre Datenbank .csv ist:

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')

Einfacher 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')
15
G M 16 Jän. 2014 im 16:19

Verwenden Sie zum Abrufen des Spaltennamens anstelle von readlines () besser readline () , um eine Schleife zu vermeiden, die gesamte Datei zu lesen und in der zu speichern Array.

with open(csv_file, 'rb') as csvfile:

    # get number of columns

    line = csvfile.readline()

    first_item = line.split(',')
-1
Suren 15 Mai 2017 im 13:52

Wenn Sie die Spalten separat verarbeiten müssen, möchte ich die Spalten mit dem Muster zip(*iterable) destrukturieren (effektiv "entpacken"). Also für Ihr Beispiel:

ids, names, zips, phones = zip(*(
  (row[1], row[2], row[6], row[7])
  for row in reader
))
0
Robert Jensen 17 Jän. 2019 im 19:43

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:

myVar = pd.read_csv('YourPath', sep = ",")['ColumnName']

Ein paar Dinge zu beachten:

Das obige Snippet erzeugt einen Pandas Series und keinen dataframe. Der Vorschlag von Ayhan mit usecols wird auch schneller sein, wenn Geschwindigkeit ein Problem ist. Das Testen der beiden unterschiedlichen Ansätze mit %timeit in einer CSV-Datei mit einer Größe von 2122 KB ergibt 22.8 ms für den usecols-Ansatz und 53 ms für meinen vorgeschlagenen Ansatz.

Und vergiss nicht import pandas as pd

1
vestland 10 Dez. 2018 im 08:33

Ich denke, es gibt einen einfacheren Weg

import pandas as pd

dataset = pd.read_csv('table1.csv')
ftCol = dataset.iloc[:, 0].values

Hier bedeutet iloc[:, 0], : bedeutet alle Werte, 0 bedeutet die Position der Spalte. Im folgenden Beispiel wird ID ausgewählt

ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
0
Nuriddin Kudratov 13 Feb. 2020 im 11:38

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']

Verwerfen Sie nicht benötigte Spalten zur Analysezeit:

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 stammen von hier und hier.

28
VasiliNovikov 17 Feb. 2019 im 16:56
import pandas as pd 
csv_file = pd.read_csv("file.csv") 
column_val_list = csv_file.column_name._ndarray_values
2
Hari K 30 Mai 2019 im 16:58

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. Das 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.

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')
5
Tshilidzi Mudau 20 Juli 2016 im 00:37