সিএসভি ডেটা প্রক্রিয়া করার সময় ডেটার প্রথম লাইনটিকে কীভাবে উপেক্ষা করবেন?


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?
Wooble

@ উবল টেকনিক্যালি এটি একটি বড় জেনারেটর 1.0। :)
ডগল

@ খুব ভাল ক্যাচ - ... datatype(row[column]... আমার ধারণা, ওপি যদিও অর্জনের চেষ্টা করছে
জন ক্লিমেটস

আমার জন্য কেউ এই কোডটি লিখেছিল এবং তা ধরেনি, তাই হাহাহা ধন্যবাদ!

উত্তর:


106

আপনি কোনও সিএসভি ফাইলের ফর্ম্যাটটি কমানোর জন্য 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আপনার উদাহরণটিতে হার্ডকোডযুক্ত, সুতরাং এটির rowমতো প্রক্রিয়া করা কিছুটা দ্রুত হবে :

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

দ্রষ্টব্য: উপরের কোডটি পাইথন ৩.x এর জন্য is পাইথন ২.x এর জন্য ফাইলটি খোলার জন্য নীচের লাইনটি যা দেখানো হয়েছে তার পরিবর্তে ব্যবহার করুন:

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

2
পরিবর্তে has_header(file.read(1024)), এটা কি লেখার অর্থ has_header(file.readline())? আমি এটি দেখতে পেয়েছি তবে আমি বুঝতে পারছি না যে কীভাবে has_reader()সিএসভি ফাইলের একক লাইন থেকে শিরোনাম রয়েছে কিনা তা সনাক্ত করতে পারি ...
এন্টো

1
@ এন্টো: আমার উত্তরের কোডটি ডকুমেন্টেশনের "স্নিফার ব্যবহারের উদাহরণ" এর উপর ভিত্তি করে রয়েছে , তাই আমি ধরে নিলাম এটি এটি করার জন্য নির্ধারিত উপায়। সে ব্যাপারে আমি সম্মত ডেটার এক লাইন ভিত্তিতে এরকম মত এটা সবসময় এই ধরনের একটি সংকল্প-কিন্তু করতে যথেষ্ট ডেটা আমি যেহেতু কোন ধারণা আছে হবে বলে মনে হচ্ছে না কিভাবেSniffer কাজ বর্ণনা করা হয়। FWIW আমি কখনও ব্যবহার has_header(file.readline())হতে দেখিনি এবং এমনকি এটি বেশিরভাগ সময় কাজ করলেও আমি বর্ণিত কারণগুলির জন্য পদ্ধতির বিষয়ে অত্যন্ত সন্দেহজনক।
মার্টিনো

আপনার ইনপুট জন্য ধন্যবাদ। তবুও মনে হচ্ছে যে file.read(1024) পাইথনের সিএসভি লাইব ব্যবহার করে ত্রুটি সৃষ্টি হয় : উদাহরণস্বরূপ এখানে দেখুন ।
Anto

@ এন্টো: আমি এর আগে কখনও এ জাতীয় ত্রুটির মুখোমুখি হইনি — 1024 বাইট মোটামুটি স্মৃতি নয় — বা এই উত্তরটি প্রাপ্ত আপ-ভোটের ভিত্তিতে অন্যান্য অনেক লোকের পক্ষেও সমস্যা ছিল না (পাশাপাশি হাজারেও দস্তাবেজটি পড়ে এবং অনুসরণ করে এমন লোকদের)। এই কারণে আমি দৃ strongly়ভাবে সন্দেহ করি যে অন্য কিছু আপনার সমস্যা সৃষ্টি করছে।
মার্টিনিউ

আমি থেকে স্যুইচ 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)))

ধন্যবাদ Veedrac। এখানে শেখার জন্য খুশি, আপনি কি এমন সম্পাদনাগুলির পরামর্শ দিতে পারেন যা আপনার উদ্ধৃত সমস্যার সমাধান করবে? আমার সমাধানটি কাজটি শেষ করে, তবে দেখে মনে হচ্ছে এটি আরও উন্নত হতে পারে?
মার্টেন

1
আমি আপনাকে এমন একটি সম্পাদনা দিয়েছি যা কোডটির পরিবর্তে এমন কিছু দিয়ে দেয় যা অভিন্ন (অনির্ধারিত) হওয়া উচিত। আপনি যা বলতে চাইছেন তার সাথে এটি না থাকলে ফিরলে নির্দ্বিধায়। আপনি কেন dataঅভিধান তৈরি করছেন তা আমি এখনও নিশ্চিত নই , না এই উত্তর সত্যই গ্রহণযোগ্যটির চেয়ে কিছু যুক্ত করে না।
Veedrac

ধন্যবাদ Veedrac! সত্যিই এটি খুব দক্ষ দেখাচ্ছে। আমি আমার উত্তর পোস্ট করেছি কারণ গৃহীত ব্যক্তিটি আমার পক্ষে কাজ করছে না (কারণটির কারণ এখন মনে করতে পারে না)। ডেটা = ডিক () নির্ধারণ এবং তত্ক্ষণাত এটি পূরণ করার ক্ষেত্রে কী সমস্যা হবে (আপনার পরামর্শের তুলনায়)?
মার্টেন

1
এটা না ভুল করতে data = dict()এবং এটি পূরণ করুন, কিন্তু এরা অকর্মণ্য এবং কথ্য নয়। তদ্ব্যতীত, একের জন্য ডিক আক্ষরিক ( {}) ব্যবহার করা উচিত এবং enumerateতারপরেও।
Veedrac

1
এফডাব্লুআইডাব্লু, আপনি অবশ্যই আমার @Veedracঅবহিত হওয়ার বিষয়ে নিশ্চিত হতে চাইলে আমার পোস্টগুলির জবাব দেওয়া উচিত , যদিও স্ট্যাক ওভারফ্লো ইউজারনেম থেকে অনুমান করতে সক্ষম হবে বলে মনে হচ্ছে। (আমি লিখছি না @Maartenকারণ উত্তরদাতাকে ডিফল্টরূপে অবহিত করা হবে))
Veedrac

21

পাইথন কুকবুক থেকে ধার করা ,
আরও সংক্ষিপ্ত টেম্পলেট কোডটি দেখতে এরকম হতে পারে:

import csv
with open('stocks.csv') as f:
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    for row in f_csv:
        # Process row ...

19

আপনি সাধারণত next(incsv)যা পুনরুক্তিকারীকে এক সারিতে অগ্রসর করে তা ব্যবহার করবেন , সুতরাং আপনি শিরোনামটি এড়িয়ে যান। অন্যটি (বলুন যে আপনি 30 টি সারি বাদ দিতে চেয়েছিলেন) তা হ'ল:

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

6

CSv.Reader এর পরিবর্তে csv.DictReader ব্যবহার করুন। যদি ক্ষেত্রের নামগুলির প্যারামিটার বাদ দেওয়া হয় তবে csvfile এর প্রথম সারির মানগুলি ক্ষেত্রের নাম হিসাবে ব্যবহৃত হবে। তারপরে আপনি সারি ["1"] ইত্যাদি ব্যবহার করে ক্ষেত্রের মানগুলিতে অ্যাক্সেস করতে সক্ষম হবেন


2

নতুন 'পান্ডাস' প্যাকেজটি 'সিএসভি' এর চেয়ে বেশি প্রাসঙ্গিক হতে পারে। নীচের কোডটি একটি সিএসভি ফাইল পড়বে, ডিফল্টরূপে প্রথম লাইনটিকে কলাম শিরোনাম হিসাবে ব্যাখ্যা করে এবং কলামগুলিতে সর্বনিম্ন সন্ধান করবে।

import pandas as pd

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

এবং আপনি এটি একটি pd.read_csv('all16.csv').min()
লাইনেও

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 যে CSV মডিউলের জন্য ডকুমেন্টেশন এই উদাহরণে প্রদান করে:

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()ফাইলটির শিরোনামের রেখা আছে কিনা তা নির্ধারণের জন্য আপনাকে স্পষ্টভাবে তার পদ্ধতিটি কল করতে হবে। যদি এটি হয় তবে সিএসভি সারিগুলি পুনরাবৃত্তি করার সময় প্রথম সারিটি এড়িয়ে যান। আপনি এটি এর মতো করতে পারেন:

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


0

শুধু যোগ করুন [1:]

নীচে উদাহরণ:

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

আইপিথনে আমার জন্য এটি কাজ করে


0

পাইথন 3. এক্স

ইউটিএফ 8 বিওএম + হেডার পরিচালনা করে

এটি বেশ হতাশার যে csvমডিউলটি সহজেই শিরোনামটি পেল না, সেখানে ইউটিএফ -8 বিওএম (ফাইলের প্রথম চর) সহ একটি বাগও রয়েছে। এটি কেবলমাত্র 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

আমি সিএসভ্রেডারকে তালিকায় রূপান্তর করব, তারপরে প্রথম উপাদানটি পপ করব

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__()

পাঠকের পুনরাবৃত্ত বস্তুর পরবর্তী সারিটি তালিকার হিসাবে (যদি বস্তুটি পাঠক () থেকে ফিরে আসে) বা ডিক (যদি এটি ডিক্ট্রিডার উদাহরণ হয়), বর্তমান উপভাষা অনুসারে পার্স করুন। সাধারণত আপনার এটি পরবর্তী (পাঠক) হিসাবে কল করা উচিত।

csv_data = csv.reader(open('sample.csv'))
csv_data.__next__() # skip first row
for row in csv_data:
    print(row) # should print second row
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.