सीएसवी मॉड्यूल से सीएसवी फ़ाइल से विशिष्ट कॉलम पढ़ें?


176

मैं एक सीएसवी फ़ाइल के माध्यम से पार्स करने और केवल विशिष्ट कॉलम से डेटा निकालने की कोशिश कर रहा हूं।

उदाहरण csv:

ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |

मैं, केवल विशिष्ट स्तंभ पर कब्जा करने की कोशिश कर रहा हूँ कहते हैं ID, Name, Zipऔर Phone

मेरे द्वारा देखे गए कोड ने मुझे विश्वास दिलाया है कि मैं विशिष्ट कॉलम को उसके संबंधित नंबर से कॉल कर सकता हूं, इसलिए:: प्रत्येक पंक्ति के माध्यम से Nameमेल 2खाएगा और इसका उपयोग करके row[2]सभी कॉलम में सभी वस्तुओं का उत्पादन करेगा। केवल यही नहीं।

यहाँ मैंने अभी तक क्या किया है:

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

और मैं उम्मीद कर रहा हूं कि यह केवल प्रत्येक पंक्ति के लिए विशिष्ट कॉलमों को प्रिंट करेगा, जो इसके अलावा नहीं है, मुझे केवल अंतिम कॉलम मिलेगा।


1
'rb'झंडा क्यों open()? क्या यह सरल नहीं होना चाहिए r?
एलाजार

7
@ एलज़ार: पायथन 2 (जो ओपी उपयोग कर रहा है) "rb"में पास होने के लिए उपयुक्त है csv.reader
DSM

आपका उदाहरण CSV फ़ाइल पाइप चरित्र को सीमांकक के रूप में क्यों दिखाता है लेकिन आपका उदाहरण कोड किसी स्थान का उपयोग करता है?
केली एस। फ्रेंच

1
@ KellyS.French मुझे लगा कि यह इस प्रश्न के प्रयोजनों के लिए डेटा की कल्पना करने में मदद करेगा।
खुलकर

जवाबों:


187

इस कोड से आपको अंतिम कॉलम मिल जाएगा, यदि आप अपने प्रिंट स्टेटमेंट को अपने forलूप में शामिल नहीं करते हैं ।

यह आपके कोड के अंत की सबसे अधिक संभावना है:

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

आप यह चाहते हैं कि यह हो:

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

अब जब हमने आपकी गलती को कवर कर लिया है, तो मैं आपको पांडा के मॉड्यूल से परिचित कराने के लिए इस समय को लेना चाहूंगा ।

पंडों को सीएसवी फ़ाइलों से निपटने के लिए शानदार है, और निम्नलिखित कोड आपको एक सीएसवी पढ़ने और एक संपूर्ण कॉलम को एक चर में सहेजने की आवश्यकता होगी:

import pandas as pd
df = pd.read_csv(csv_file)
saved_column = df.column_name #you can also use df['column_name']

इसलिए यदि आप अपने कॉलम की सभी जानकारी Namesको एक चर में सहेजना चाहते हैं, तो आपको बस इतना करना होगा:

names = df.Names

यह एक शानदार मॉड्यूल है और मेरा सुझाव है कि आप इस पर गौर करें। यदि किसी कारण से आपका प्रिंट स्टेटमेंट forलूप में था और यह अभी भी केवल आखिरी कॉलम प्रिंट कर रहा था , जो नहीं होना चाहिए, लेकिन मुझे बताएं कि क्या मेरी धारणा गलत थी। आपके पोस्ट किए गए कोड में बहुत अधिक इंडेंटेशन त्रुटियां हैं, इसलिए यह जानना कठिन था कि क्या होना चाहिए था। आशा है कि यह मददगार था!


1
क्या क्वेरी से सूचकांक संख्या को निकालना संभव है? @ रेयान सक्से
मलाकी बाजार

हां, लूप के लिए इसके माध्यम से पुनरावृति करें।
डेगग्लेंट 14

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

जैसी फाइल के साथ

name,phone,street
Bob,0893,32 Silly
James,000,400 McHilly
Smithers,4442,23 Looped St.

उत्पादन करेगा

>>> 
['Bob', 'James', 'Smithers']
['0893', '000', '4442']
['32 Silly', '400 McHilly', '23 Looped St.']

या वैकल्पिक रूप से यदि आप स्तंभों के लिए संख्यात्मक अनुक्रमण चाहते हैं:

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

अपराधी को बदलने के delimiter=" "लिए उपयुक्त तात्कालिकता में जोड़ें , अर्थातreader = csv.reader(f,delimiter=" ")


30

पांडा का उपयोग करें :

import pandas as pd
my_csv = pd.read_csv(filename)
column = my_csv.column_name
# you can also use my_csv['column_name']

पार्स समय में अनावश्यक स्तंभों को त्यागें:

my_filtered_csv = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])

पुनश्च मैं केवल एक दूसरे को सरल तरीके से कही गई बातों को एकत्र कर रहा हूं। वास्तविक उत्तर यहां और यहां से लिए गए हैं


1
मुझे लगता है कि पंडों को पूरी तरह से स्वीकार्य समाधान है। मैं अक्सर और वास्तव में पुस्तकालय की तरह पंडों का उपयोग करता हूं, लेकिन इस प्रश्न ने विशेष रूप से सीएसवी मॉड्यूल का संदर्भ दिया।
फ्रैंकवी

1
@frankV खैर, शीर्षक, टैग और पहला पैराग्राफ किसी भी तरह से पांडा को मना नहीं करते, AFAI देख सकते हैं। मैं वास्तव में बस उन लोगों के लिए एक सरल उत्तर जोड़ने की उम्मीद कर रहा हूं जो पहले से ही यहां बनाए गए हैं (अन्य उत्तर पांडा का भी उपयोग करते हैं)।
वसीलीनोविकोव

18

पांडा के साथ आप पैरामीटर के read_csvसाथ उपयोग कर सकते हैं usecols:

df = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])

उदाहरण:

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

16

आप उपयोग कर सकते हैं numpy.loadtext(filename)। उदाहरण के लिए यदि यह आपका डेटाबेस है .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 |

और आप 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')

अधिक आसानी से आप उपयोग कर सकते हैं genfromtext:

b = np.genfromtxt(r'filepath\name.csv', delimiter='|', names=True,dtype=None)
>>> b['Name']
array([' Adam ', ' Carl ', ' Adolf ', ' Den '], 
      dtype='|S7')

@G 'filepath \ name.csv' के बगल में एक r होने का मतलब है?
114

6

प्रसंग: इस प्रकार के काम के लिए आपको अद्भुत पाइथन पेटल लाइब्रेरी का उपयोग करना चाहिए। यह आपको मानक सीएसवी मॉड्यूल के साथ चीजों को मैन्युअल रूप से करने से बहुत सारे काम और संभावित निराशा से बचाएगा। AFAIK, एकमात्र लोग जो अभी भी सीएसवी मॉड्यूल का उपयोग करते हैं, वे हैं जिन्होंने अभी तक सारणीबद्ध डेटा (पांडा, पेटल, आदि) के साथ काम करने के लिए बेहतर उपकरण नहीं खोजे हैं, जो ठीक है, लेकिन अगर आप बहुत सारे डेटा के साथ काम करने की योजना बनाते हैं विभिन्न विचित्र स्रोतों से आपका करियर, पेटल की तरह कुछ सीखना सबसे अच्छा निवेश है जो आप कर सकते हैं। आरंभ करने के लिए आपको पाइप इंस्टॉल पेटल करने के बाद केवल 30 मिनट का समय लेना चाहिए। प्रलेखन उत्कृष्ट है।

उत्तर: मान लें कि आपके पास सीएसवी फ़ाइल में पहली तालिका है (आप पेटल का उपयोग करके डेटाबेस से सीधे लोड भी कर सकते हैं)। तब आप बस इसे लोड करेंगे और निम्न कार्य करेंगे।

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

मुझे लगता है कि एक आसान तरीका है

import pandas as pd

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

तो यहाँ में iloc[:, 0], :सभी मानों का 0अर्थ है, स्तंभ की स्थिति। नीचे दिए गए उदाहरण में IDचुना जाएगा

ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |

अगर यह लोगों को काम करता है, तो कृपया अपवोट करें, दूसरों को इसे बताएं :)
नुरिद्दीन कुदरतोव


1

जिस तरह से आप एक पांडा डेटाफ्रेम को इंडेक्स और सब्मिट कर सकते हैं, उसके लिए धन्यवाद, एक csv फ़ाइल से एक चर में एक एकल कॉलम निकालने का बहुत आसान तरीका है:

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

विचार करने के लिए कुछ बातें:

ऊपर का स्निपेट एक पांडा पैदा करेगा Seriesऔर नहीं dataframeusecolsअगर गति एक मुद्दा है, तो अहान के साथ सुझाव भी तेज होगा। %timeit2122 KB आकार की सीएसवी फ़ाइल पैदावार 22.8 msके लिए usecols दृष्टिकोण और 53 msमेरे सुझाए दृष्टिकोण के लिए उपयोग करने वाले दो अलग-अलग तरीकों का परीक्षण करना ।

और मत भूलना import pandas as pd


0

यदि आपको कॉलम को अलग से संसाधित करने की आवश्यकता है, तो मुझे zip(*iterable)पैटर्न के साथ कॉलम को नष्ट करना पसंद है (प्रभावी रूप से "अनज़िप")। तो आपके उदाहरण के लिए:

ids, names, zips, phones = zip(*(
  (row[1], row[2], row[6], row[7])
  for row in reader
))

-1

कॉलम नाम को लाने के लिए , लूप से बचने के लिए रीडलाइन () का बेहतर उपयोग करें () लूप से बचने के लिए और पूरी फाइल को पढ़ने और एरे में स्टोर करें।

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

    # get number of columns

    line = csvfile.readline()

    first_item = line.split(',')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.