সিএসভি মডিউল সহ কোনও সিএসভি ফাইল থেকে নির্দিষ্ট কলামগুলি পড়ুন?


176

আমি একটি সিএসভি ফাইলের মাধ্যমে বিশ্লেষণ করার চেষ্টা করছি এবং কেবলমাত্র নির্দিষ্ট কলামগুলি থেকে ডেটা বের করতে পারি।

সিএসভির উদাহরণ:

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]কলাম ২ এ সমস্ত আইটেম তৈরি করবে Only কেবল এটি নয়।

আমি এখন পর্যন্ত যা করেছি তা এখানে:

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

এবং আমি প্রত্যাশা করছি যে এটি প্রতিটি সারিটির জন্য কেবলমাত্র নির্দিষ্ট কলামগুলি প্রিন্ট করবে যা ব্যতীত আমি কেবল শেষ কলামটি পেয়েছি get


1
'rb'পতাকা কেন open()? এটা সহজ না হওয়া উচিত r?
এলাজার

7
@ এলাজার: পাইথন 2 এ (যা ওপি ব্যবহার করছে) "rb"পাস করার জন্য উপযুক্ত csv.reader
ডিএসএম

কেন আপনার উদাহরণ সিএসভি ফাইল ডিলিমিটার হিসাবে পাইপ চরিত্রটি দেখায় তবে আপনার উদাহরণ কোডটি একটি স্থান ব্যবহার করে?
কেলি এস ফরাসী

1
@ কেলি.ফ্রিঞ্চ আমি ভেবেছিলাম এটি এই প্রশ্নের উদ্দেশ্যগুলির জন্য ডেটা ভিজ্যুয়ালাইজড করতে সহায়তা করবে।
ফ্র্যাঙ্কভি

উত্তর:


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

এখন যেহেতু আমরা আপনার ভুলটি coveredেকে রেখেছি, আমি আপনাকে পান্ডাস মডিউলটির সাথে পরিচয় করিয়ে দিতে এই সময়টি নিতে চাই ।

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

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
কোয়েরি থেকে সূচী নম্বরগুলি মুছে ফেলা সম্ভব? @ রায়ান স্যাক্সে
মালাচি বাজার

হ্যাঁ, লুপের জন্য কেবল এটির মাধ্যমে পুনরাবৃত্তি করুন।
ডেভেলগ্যালেন্ট

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
@ ফ্র্যাঙ্কভি ওয়েল, শিরোনাম, ট্যাগ এবং প্রথম অনুচ্ছেদে কোনওভাবেই পান্ডাদের নিষেধ করা হয়নি, এএফএআই দেখতে পাবে। আমি ইতিমধ্যে এখানে ইতিমধ্যে তৈরি করা একটি সহজ উত্তর যুক্ত করার আশা করেছি (অন্যান্য উত্তরগুলিও পান্ডা ব্যবহার করে)।
ভাসিলিনভিকভ

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

@ জি 'ফাইলপথ \ name.csv' এর পাশে আর আছে কি?
114

6

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

আপনি যেভাবে পান্ডাস ডেটাফ্রেমকে সূচক এবং সাবসেট করতে পারেন তার জন্য ধন্যবাদ, সিএসভি ফাইল থেকে একটি ভেরিয়েবলের মধ্যে একটি একক কলাম বের করার খুব সহজ উপায়:

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

কয়েকটি বিষয় বিবেচনা করুন:

উপরের স্নিপেট একটি পান্ডাস উত্পাদন করবে Seriesএবং না dataframeusecolsগতিকে সমস্যা হিসাবে চিহ্নিত করা থাকলে অহহানের পরামর্শটিও দ্রুত হবে। 21c %timeitKB সাইজের 22.8 msসিএসভি ফাইলের ব্যবহারগুলি ব্যবহারকারীর 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

আনতে কলামের নামের পরিবর্তে ব্যবহার করার, readlines () ভাল ব্যবহার readline () এড়ানোর লুপ করতে & সম্পূর্ণ ফাইল পড়া ও অ্যারের মধ্যে এটি সংরক্ষণ।

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

    # get number of columns

    line = csvfile.readline()

    first_item = line.split(',')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.