CSV डेटा को संसाधित करते समय डेटा की पहली पंक्ति को कैसे अनदेखा करें?


113

मैं पायथन को सीएसवी डेटा के एक कॉलम से न्यूनतम संख्या प्रिंट करने के लिए कह रहा हूं, लेकिन शीर्ष पंक्ति स्तंभ संख्या है, और मैं नहीं चाहता कि पायथन शीर्ष पंक्ति को ध्यान में रखे। मैं यह कैसे सुनिश्चित कर सकता हूं कि पायथन पहली पंक्ति की उपेक्षा करता है?

यह अब तक का कोड है:

import csv

with open('all16.csv', 'rb') as inf:
    incsv = csv.reader(inf)
    column = 1                
    datatype = float          
    data = (datatype(column) for row in incsv)   
    least_value = min(data)

print least_value

क्या आप यह भी समझा सकते हैं कि आप क्या कर रहे हैं, न कि केवल कोड दें? मैं पायथन के लिए बहुत नया हूं और यह सुनिश्चित करना चाहूंगा कि मुझे सब कुछ समझ में आए।


5
क्या आप जानते हैं कि आप सिर्फ एक जनरेटर बना रहे हैं 1.0, जो आपकी फ़ाइल में प्रत्येक पंक्ति के लिए लौटाता है और फिर न्यूनतम लेता है, जो होने जा रहा है 1.0?
जुले

तकनीकी रूप से, यह एक बड़ा जनरेटर है 1.0। :)
डगल २५:१२

@Wooble अच्छा पकड़ - ... datatype(row[column]... मैं क्या लगता है कि ओपी हालांकि हासिल करने की कोशिश कर रहा है
जॉन क्लेमेंट्स

मैं किसी ने मेरे लिए उस कोड को लिखा था और वह पकड़ नहीं था, इसलिए धन्यवाद हाहा!

जवाबों:


106

आप CSV फ़ाइल के प्रारूप को घटाने के लिए csvमॉड्यूल की Snifferकक्षा के एक उदाहरण का उपयोग कर सकते हैं और यह पता लगा सकते हैं कि क्या हेडर बिल्ट-इन next()फ़ंक्शन के साथ मौजूद है या नहीं, केवल पहली पंक्ति को छोड़ने के लिए।

import csv

with open('all16.csv', 'r', newline='') as file:
    has_header = csv.Sniffer().has_header(file.read(1024))
    file.seek(0)  # Rewind.
    reader = csv.reader(file)
    if has_header:
        next(reader)  # Skip header row.
    column = 1
    datatype = float
    data = (datatype(row[column]) for row in reader)
    least_value = min(data)

print(least_value)

के बाद से datatypeऔर columnअपने उदाहरण में hardcoded रहे हैं, यह थोड़ा तेज कार्रवाई करने के लिए किया जाएगा rowइस तरह:

    data = (float(row[1]) for row in reader)

नोट: उपरोक्त कोड पाइथन 3.x के लिए है। पायथन 2.x के लिए फ़ाइल को दिखाने के बजाय निम्नलिखित लाइन का उपयोग करें:

with open('all16.csv', 'rb') as file:

2
इसके बजाय has_header(file.read(1024)), यह लिखने के लिए समझ में आता है has_header(file.readline())? मुझे वह बहुत कुछ दिखाई देता है, लेकिन मुझे समझ में नहीं आता कि has_reader()CSV फ़ाइल की एक पंक्ति से हेडर कैसे है या नहीं, यह कैसे पता लगाया जा सकता है ...
Anto

1
@ एंटो: मेरे उत्तर में कोड प्रलेखन में "स्निफर उपयोग के लिए उदाहरण" पर आधारित है , इसलिए मुझे लगता है कि यह इसे करने का निर्धारित तरीका है। मैं मानता हूं कि डेटा की एक पंक्ति के आधार पर ऐसा करने से ऐसा नहीं लगता है कि ऐसा निर्धारण करने के लिए हमेशा पर्याप्त डेटा होगा - लेकिन मुझे इस बात का कोई पता नहीं है कि काम कैसेSniffer वर्णित नहीं है। FWIW मैं गया है कभी नहीं देखा has_header(file.readline())इस्तेमाल किया जा रहा है और भले ही वह समय के सबसे अधिक काम किया है, मैं ने कहा कारणों के लिए दृष्टिकोण के अत्यधिक संदिग्ध होगा।
मार्टीन्यू

आपके सहयोग के लिए धन्यवाद। फिर भी ऐसा लगता है कि file.read(1024) अजगर की सीएसएस लिब में त्रुटियों को उत्पन्न करता है :। उदाहरण के लिए यहां भी देखें ।
Anto

@ एंटो: मैंने कभी इस तरह की त्रुटि का सामना नहीं किया है - 1024 बाइट्स के बाद बहुत अधिक मेमोरी नहीं होती है और न ही यह इस जवाब को प्राप्त हुए अप-वोट के आधार पर कई अन्य लोगों के लिए एक समस्या रही है (साथ ही साथ हजारों उन लोगों के बारे में जिन्होंने प्रलेखन को पढ़ा है और उनका अनुसरण किया है)। उन कारणों से मुझे दृढ़ता से संदेह है कि कुछ और आपके मुद्दे का कारण बन रहा है।
मार्टीन्यू

मैं जैसे ही मैं से बदल यह ठीक उसी त्रुटि का सामना readline()करने के लिए read(1024)। अब तक मैं केवल उन लोगों को ढूंढने में कामयाब रहा हूं जिन्होंने csv.dialect मुद्दे को हल करने के लिए रीडलाइन पर स्विच किया है।
Anto

75

पहली पंक्ति को छोड़ने के लिए सिर्फ कॉल करें:

next(inf)

पायथन में फाइलें लाइनों पर चलने वाले हैं।


22

इसी तरह के उपयोग के मामले में मुझे अपने वास्तविक कॉलम नामों के साथ लाइन से पहले कष्टप्रद लाइनों को छोड़ना पड़ा। यह समाधान अच्छी तरह से काम किया। पहले फ़ाइल पढ़ें, फिर सूची को पास करें csv.DictReader

with open('all16.csv') as tmp:
    # Skip first line (if any)
    next(tmp, None)

    # {line_num: row}
    data = dict(enumerate(csv.DictReader(tmp)))

धन्यवाद विद्रेक यहां जानकर खुशी हुई, क्या आप ऐसे संपादन सुझा सकते हैं जो आपके द्वारा बताई गई समस्याओं को हल करेंगे? मेरे समाधान से काम पूरा हो जाता है, लेकिन ऐसा लगता है कि इसमें और सुधार किया जा सकता है?
मार्टन

1
मैंने आपको एक ऐसा एडिट दिया जो कोड को ऐसी चीज़ से बदल देता है जो समान (अनटाइटेड) होनी चाहिए। यदि आपका मतलब के अनुरूप नहीं है, तो इसे वापस करने के लिए स्वतंत्र महसूस करें। मुझे अभी भी यकीन नहीं है कि आप dataशब्दकोश क्यों बना रहे हैं , और न ही यह जवाब वास्तव में स्वीकृत एक पर कुछ भी जोड़ता है।
विड्राक

धन्यवाद Veedrac! यह वास्तव में बहुत कुशल लग रहा है। मैंने अपना जवाब पोस्ट किया क्योंकि स्वीकृत व्यक्ति मेरे लिए काम नहीं कर रहा था (अब कारण याद नहीं कर सकता)। डेटा को परिभाषित करने में क्या समस्या होगी = तानाशाही () और फिर तुरंत इसे भरना (आपके सुझाव की तुलना में)?
Maarten

1
इसे करना और इसे भरना गलत नहीं हैdata = dict() , लेकिन यह अक्षम है और मुहावरेदार नहीं है। साथ ही, किसी को तानाशाहों ( {}) और enumerateतब भी का उपयोग करना चाहिए ।
विड्राक

1
एफडब्ल्यूआईडब्लू, आपको मेरे पोस्ट का जवाब देना चाहिए @Veedracअगर आप सुनिश्चित करना चाहते हैं कि मुझे सूचित किया जाए, हालांकि स्टैक ओवरफ्लो उपयोगकर्ता नाम से अनुमान लगाने में सक्षम है। (मैं नहीं लिखता @Maartenक्योंकि उत्तर देने वाले को डिफ़ॉल्ट रूप से सूचित किया जाएगा।)
विड्रैक


19

आप सामान्य रूप से उपयोग करेंगे next(incsv)जो पुनरावृत्त एक पंक्ति को आगे बढ़ाता है, इसलिए आप शीर्ष लेख को छोड़ देते हैं। अन्य (कहते हैं कि आप 30 पंक्तियों को छोड़ना चाहते थे) होगा:

from itertools import islice
for row in islice(incsv, 30, None):
    # process

6

csv.Rictder के बजाय csv.DictReader का उपयोग करें। यदि फ़ील्डनाम पैरामीटर को छोड़ दिया जाता है, तो csvfile की पहली पंक्ति के मानों को फ़ील्ड नामों के रूप में उपयोग किया जाएगा। तब आप पंक्ति ["1"] आदि का उपयोग करके फ़ील्ड मानों तक पहुँचने में सक्षम होंगे


2

नया 'पांडा' पैकेज 'सीएसवी' की तुलना में अधिक प्रासंगिक हो सकता है। नीचे दिया गया कोड CSV फ़ाइल को कॉलम हेडर के रूप में पहली पंक्ति की डिफ़ॉल्ट रूप से व्याख्या करके और कॉलम भर में न्यूनतम खोजेगा।

import pandas as pd

data = pd.read_csv('all16.csv')
data.min()

और आप इसे एक पंक्ति में भी लिख सकते हैं:pd.read_csv('all16.csv').min()
फिन elsरूप नील्सन

1

खैर, मेरा मिनी रैपर लाइब्रेरी भी यही काम करेगा।

>>> import pyexcel as pe
>>> data = pe.load('all16.csv', name_columns_by_row=0)
>>> min(data.column[1])

इस बीच, यदि आप जानते हैं कि हेडर कॉलम इंडेक्स एक क्या है, उदाहरण के लिए "कॉलम 1", तो आप इसके बजाय ऐसा कर सकते हैं:

>>> min(data.column["Column 1"])

1

मेरे लिए सबसे आसान तरीका है रेंज का उपयोग करना।

import csv

with open('files/filename.csv') as I:
    reader = csv.reader(I)
    fulllist = list(reader)

# Starting with data skipping header
for item in range(1, len(fulllist)): 
    # Print each row using "item" as the index value
    print (fulllist[item])  

1

क्योंकि यह मेरे द्वारा किए जा रहे कुछ से संबंधित है, मैं यहां साझा करूंगा।

क्या होगा अगर हमें यकीन नहीं है अगर हेडर है और आप भी स्निफर और अन्य चीजों को आयात करने का मन नहीं करते हैं?

यदि आपका कार्य बुनियादी है, जैसे किसी सूची या सरणी को प्रिंट करना या जोड़ना, तो आप केवल एक बयान का उपयोग कर सकते हैं:

# Let's say there's 4 columns
with open('file.csv') as csvfile:
     csvreader = csv.reader(csvfile)
# read first line
     first_line = next(csvreader)
# My headers were just text. You can use any suitable conditional here
     if len(first_line) == 4:
          array.append(first_line)
# Now we'll just iterate over everything else as usual:
     for row in csvreader:
          array.append(row)

1

अजगर 3 सीएसवी मॉड्यूल के लिए प्रलेखन इस उदाहरण प्रदान करता है:

with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ...

SnifferCSV फ़ाइल के बारे में बहुत सी बातें-ऑटो पहचान करने की कोशिश करेंगे। has_header()फ़ाइल को हेडर लाइन है या नहीं यह निर्धारित करने के लिए आपको इसकी विधि को स्पष्ट रूप से कॉल करने की आवश्यकता है । यदि ऐसा होता है, तो CSV पंक्तियों को पुनरावृत्त करते समय पहली पंक्ति छोड़ें। आप इसे इस तरह से कर सकते हैं:

if sniffer.has_header():
    for header_row in reader:
        break
for data_row in reader:
    # do something with the row

0

मैं अवांछित पहली पंक्ति से छुटकारा पाने के लिए पूंछ का उपयोग करूंगा :

tail -n +2 $INFIL | whatever_script.py 

0

बस जोड़ें [1:]

नीचे उदाहरण:

data = pd.read_csv("/Users/xyz/Desktop/xyxData/xyz.csv", sep=',', header=None)**[1:]**

कि iPython में मेरे लिए काम करता है


0

अजगर 3.X

UTF8 BOM + HEADER संभालती है

यह काफी निराशाजनक था कि csvमॉड्यूल को हेडर आसानी से नहीं मिल सकता है, UTF-8 BOM (फ़ाइल में पहला चार्ट) के साथ एक बग भी है। यह मेरे लिए केवल csvमॉड्यूल का उपयोग करके काम करता है :

import csv

def read_csv(self, csv_path, delimiter):
    with open(csv_path, newline='', encoding='utf-8') as f:
        # https://bugs.python.org/issue7185
        # Remove UTF8 BOM.
        txt = f.read()[1:]

    # Remove header line.
    header = txt.splitlines()[:1]
    lines = txt.splitlines()[1:]

    # Convert to list.
    csv_rows = list(csv.reader(lines, delimiter=delimiter))

    for row in csv_rows:
        value = row[INDEX_HERE]

0

मैं csvreader को सूची में बदलूंगा, फिर पहला तत्व पॉप करूँगा

import csv        

with open(fileName, 'r') as csvfile:
        csvreader = csv.reader(csvfile)
        data = list(csvreader)               # Convert to list
        data.pop(0)                          # Removes the first row

        for row in data:
            print(row)

0

अजगर 2.x

csvreader.next()

एक सूची के रूप में पाठक की पुनरावृत्त वस्तु की अगली पंक्ति लौटें, वर्तमान बोली के अनुसार पार्स की गई।

csv_data = csv.reader(open('sample.csv'))
csv_data.next() # skip first row
for row in csv_data:
    print(row) # should print second row

अजगर 3.x

csvreader.__next__()

एक सूची के रूप में पाठक की पुनरावृत्त वस्तु की अगली पंक्ति लौटें (यदि वस्तु पाठक () से वापस आ गई थी) या एक तानाशाही (यदि यह एक DictReader उदाहरण है), तो वर्तमान बोली के अनुसार पार्स किया गया। आमतौर पर आपको इसे अगला (पाठक) कहना चाहिए।

csv_data = csv.reader(open('sample.csv'))
csv_data.__next__() # skip first row
for row in csv_data:
    print(row) # should print second row
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.