सूची में पायथन आयात सीएसवी


193

मेरे पास लगभग 2000 रिकॉर्ड के साथ CSV फ़ाइल है।

प्रत्येक रिकॉर्ड में एक स्ट्रिंग और एक श्रेणी है:

This is the first line,Line1
This is the second line,Line2
This is the third line,Line3

मुझे इस फ़ाइल को एक सूची में पढ़ने की ज़रूरत है जो इस तरह दिखती है:

data = [('This is the first line', 'Line1'),
        ('This is the second line', 'Line2'),
        ('This is the third line', 'Line3')]

पायथन का उपयोग करके मुझे इस सीएसवी को उस सूची में कैसे आयात किया जा सकता है?


2
फिर csvमॉड्यूल का उपयोग करें: docs.python.org/2/library/csv.html
फर

4
यदि कोई उत्तर है जो आपके प्रश्न के अनुकूल है, तो कृपया इसे स्वीकार करें।
मैकीज गोल

जवाबों:


306

सीएसवी मॉड्यूल का उपयोग करना :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = list(reader)

print(data)

आउटपुट:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

यदि आपको टुपल्स की आवश्यकता है:

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = [tuple(row) for row in reader]

print(data)

आउटपुट:

[('This is the first line', 'Line1'), ('This is the second line', 'Line2'), ('This is the third line', 'Line3')]

ओल्ड पायथन 2 उत्तर, csvमॉड्यूल का उपयोग भी :

import csv
with open('file.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print your_list
# [['This is the first line', 'Line1'],
#  ['This is the second line', 'Line2'],
#  ['This is the third line', 'Line3']]

4
आप 'आर' के बजाय 'आरबी' का उपयोग क्यों करते हैं?
21'15

5
@DrunkenMaster, bपाठ मोड के विपरीत फ़ाइल को बाइनरी मोड में खोलने का कारण बनता है। कुछ सिस्टम पर टेक्स्ट मोड का मतलब है कि \nपढ़ने या लिखने पर प्लेटफ़ॉर्म-विशिष्ट नई लाइन में परिवर्तित हो जाएगा। डॉक्स देखें
मैकीज गोल

7
यह अजगर 3.x में काम नहीं करता: "csv.Error: इटरेटर सूत्र चाहिए, तो बाइट्स नहीं (आप पाठ मोड में फ़ाइल खोलने किया?)" जवाब के लिए नीचे देखें कि अजगर 3.x में काम करता है
गिल्बर्ट

2
डिबगिंग के कुछ सेकंड बचाने के लिए, आपको संभवतः पहले समाधान के लिए एक नोट जोड़ना चाहिए, जैसे "पायथन 2.x संस्करण"
पैराडाइट

कैसे अपने 1 समाधान का उपयोग करने के लिए लेकिन csv फ़ाइल से केवल कुछ कॉलम के साथ?
सिगुर

54

पायथन 3 के लिए अपडेट किया गया :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print(your_list)

आउटपुट:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

निर्दिष्ट करना 'r'डिफ़ॉल्ट मोड है, इसलिए इसे निर्दिष्ट करना अनावश्यक है। डॉक्स में यह भी उल्लेख किया गया है कि अगर csvfile एक फ़ाइल ऑब्जेक्ट है, तो इसे newline = '' के साथ खोला जाना चाहिए।
एएमसी

44

पंडों डेटा से निपटने में बहुत अच्छा है। इसका उपयोग करने का एक उदाहरण यहां दिया गया है:

import pandas as pd

# Read the CSV into a pandas data frame (df)
#   With a df you can do many things
#   most important: visualize data with Seaborn
df = pd.read_csv('filename.csv', delimiter=',')

# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]

# or export it as a list of dicts
dicts = df.to_dict().values()

एक बड़ा लाभ यह है कि पांडा शीर्ष लेख पंक्तियों के साथ स्वचालित रूप से व्यवहार करता है।

यदि आपने सीबोर्न के बारे में नहीं सुना है , तो मैं इसे देखने की सलाह देता हूं।

यह भी देखें: मैं पायथन के साथ सीएसवी फाइलें कैसे पढ़ और लिख सकता हूं?

पंडों # 2

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
dicts = df.to_dict('records')

Df की सामग्री है:

     country   population population_time    EUR
0    Germany   82521653.0      2016-12-01   True
1     France   66991000.0      2017-01-01   True
2  Indonesia  255461700.0      2017-01-01  False
3    Ireland    4761865.0             NaT   True
4      Spain   46549045.0      2017-06-01   True
5    Vatican          NaN             NaT   True

Dicts की सामग्री है

[{'country': 'Germany', 'population': 82521653.0, 'population_time': Timestamp('2016-12-01 00:00:00'), 'EUR': True},
 {'country': 'France', 'population': 66991000.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': True},
 {'country': 'Indonesia', 'population': 255461700.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': False},
 {'country': 'Ireland', 'population': 4761865.0, 'population_time': NaT, 'EUR': True},
 {'country': 'Spain', 'population': 46549045.0, 'population_time': Timestamp('2017-06-01 00:00:00'), 'EUR': True},
 {'country': 'Vatican', 'population': nan, 'population_time': NaT, 'EUR': True}]

पंडों # 3

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
lists = [[row[col] for col in df.columns] for row in df.to_dict('records')]

की सामग्री listsहै:

[['Germany', 82521653.0, Timestamp('2016-12-01 00:00:00'), True],
 ['France', 66991000.0, Timestamp('2017-01-01 00:00:00'), True],
 ['Indonesia', 255461700.0, Timestamp('2017-01-01 00:00:00'), False],
 ['Ireland', 4761865.0, NaT, True],
 ['Spain', 46549045.0, Timestamp('2017-06-01 00:00:00'), True],
 ['Vatican', nan, NaT, True]]

tuples = [tuple(x) for x in df.values]के tuples = list(df.itertuples(index=False))बजाय लिखा जा सकता है । ध्यान दें कि पंडों के .valuesपक्ष में उपयोग को हतोत्साहित करते हैं .to_numpy()। तीसरा उदाहरण मेरे लिए भ्रमित करने वाला है। सबसे पहले, क्योंकि चर का नाम दिया गया है tuples, जिसका अर्थ होगा कि यह ट्यूपल्स की एक सूची है, जबकि यह वास्तव में सूचियों की एक सूची है। दूसरा, क्योंकि जहां तक ​​मैं बता सकता हूं कि पूरी अभिव्यक्ति के साथ प्रतिस्थापित किया जा सकता है df.to_list()। मैं यह भी नहीं जानता कि क्या दूसरा उदाहरण वास्तव में यहाँ प्रासंगिक है।
एएमसी

9

पायथन 3 के लिए अपडेट:

import csv
from pprint import pprint

with open('text.csv', newline='') as file:
    reader = csv.reader(file)
    res = list(map(tuple, reader))

pprint(res)

आउटपुट:

[('This is the first line', ' Line1'),
 ('This is the second line', ' Line2'),
 ('This is the third line', ' Line3')]

यदि csvfile एक फ़ाइल ऑब्जेक्ट है, तो इसे साथ खोला जाना चाहिए newline=''
सीएसवी मॉड्यूल


list(map())सूची समझ का उपयोग क्यों करें ? इसके अलावा, दूसरे कॉलम के प्रत्येक तत्व की शुरुआत में व्हाट्सएप को नोटिस करें।
AMC

5

यदि आप सुनिश्चित हैं कि आपके इनपुट में कोई अल्पविराम नहीं हैं, तो श्रेणी को अलग करने के अलावा, आप फ़ाइल लाइन को लाइन से पढ़ सकते हैं और उस पर विभाजित कर सकते हैं, , फिर परिणाम को धक्का देंList

उस ने कहा, ऐसा लगता है कि आप एक सीएसवी फ़ाइल देख रहे हैं, इसलिए आप इसके लिए मॉड्यूल का उपयोग करने पर विचार कर सकते हैं


4
result = []
for line in text.splitlines():
    result.append(tuple(line.split(",")))

1
क्या आप कृपया इस पोस्ट में थोड़ा सा स्पष्टीकरण जोड़ सकते हैं? कोड केवल (कभी-कभी) अच्छा है, लेकिन कोड और स्पष्टीकरण (ज्यादातर बार) बेहतर है
बैरनका

3
मुझे पता है कि बैरेंका की टिप्पणी एक साल से अधिक पुरानी है, लेकिन जो कोई भी इस पर ठोकर खाता है और उसका पता नहीं लगा सकता है: text.splitlines () में लाइन के लिए: अस्थायी चर "लाइन" में प्रत्येक व्यक्ति लाइन डालता है। line.split (",") स्ट्रिंग्स की एक सूची बनाता है जो अल्पविराम पर विभाजित होती हैं। tuple (~) उस सूची को tuple में डालता है और परिशिष्ट (~) इसे परिणाम में जोड़ता है। लूप के बाद, परिणाम tuples की एक सूची है, प्रत्येक tuple एक लाइन के साथ, और प्रत्येक tuple तत्व csv फ़ाइल में एक तत्व है।
लुई

@Louis ने जो कहा, इसके अलावा, उपयोग करने की कोई आवश्यकता नहीं है .read().splitlines(), आप सीधे फ़ाइल की प्रत्येक पंक्ति पर पुनरावृति कर सकते हैं: for line in in_file: res.append(tuple(line.rstrip().split(",")))इसके अलावा, कृपया ध्यान दें कि उपयोग करने का .split(',')अर्थ है कि दूसरे कॉलम का प्रत्येक तत्व अतिरिक्त व्हाट्सएप से शुरू होगा।
एएमसी

कोड के लिए परिशिष्ट जो मैंने अभी ऊपर साझा किया है: line.rstrip()-> line.rstrip('\n')
AMC

3

जैसा कि टिप्पणियों में पहले ही कहा गया है कि आप csvलाइब्रेरी का उपयोग अजगर में कर सकते हैं । सीएसवी का अर्थ है अल्पविराम से अलग किए गए मान जो कि वास्तव में आपका मामला है: एक लेबल और एक अल्पविराम द्वारा अलग किया गया मान।

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

वैसे भी नीचे दिए गए कोड में मैं दोनों तरीके दिखाता हूं: dशब्दकोश है और lटुपल्स की सूची है।

import csv

file_name = "test.txt"
try:
    csvfile = open(file_name, 'rt')
except:
    print("File not found")
csvReader = csv.reader(csvfile, delimiter=",")
d = dict()
l =  list()
for row in csvReader:
    d[row[1]] = row[0]
    l.append((row[0], row[1]))
print(d)
print(l)

फ़ाइल को संभालने के लिए एक संदर्भ प्रबंधक का उपयोग क्यों नहीं किया जाता है? आप दो अलग-अलग चर नामकरण सम्मेलनों को क्यों मिला रहे हैं? नहीं है (row[0], row[1])कमजोर / अधिक त्रुटि प्रवण बस का उपयोग करने से tuple(row)?
एएमसी

आप क्यों सोचते हैं कि टूपल (पंक्ति) करने से त्रुटि कम होती है? किस नामकरण कन्वेंशन में यू का जिक्र किया जाता है? कृपया एक आधिकारिक अजगर नामकरण सम्मेलन को लिंक करें। जहाँ तक मुझे पता है कि try -except फ़ाइलों को संभालने का एक अच्छा तरीका है: संदर्भ हैंडलर का यू क्या मतलब है?
फ्रांसेस्को बोई

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

मैं नहीं देखता कि कैसे संदर्भ प्रबंधक ol की अच्छी कोशिश को छोड़कर ब्लॉक से बेहतर होगा। अन्य सकारात्मक पहलू के लिए यह है कि यू टाइप कम कोड; बाकी के लिए यदि तत्वों की संख्या (मुझे लगता है कि आप स्तंभों की संख्या का मतलब है) मेरा बदलाव बेहतर है क्योंकि यह केवल वांछित मूल्यों को निकाल रहा है, जबकि दूसरा यह सभी एक्सेल निकाल रहा है। किसी भी विशिष्ट आवश्यकता के बिना आप यह नहीं कह सकते हैं कि यह बेहतर है इसलिए यह बहस करना समय की बर्बादी है जो बेहतर है: इस मामले में दोनों वैध हैं
फ्रांसेस्को बोई

मैं नहीं देखता कि कैसे संदर्भ प्रबंधक ol की अच्छी कोशिश को छोड़कर ब्लॉक से बेहतर होगा। कृपया मेरी पिछली टिप्पणी देखें, संदर्भ प्रबंधक कोशिश को छोड़कर प्रतिस्थापित नहीं करेगा
एएमसी

2

एक साधारण लूप पर्याप्त होगा:

lines = []
with open('test.txt', 'r') as f:
    for line in f.readlines():
        l,name = line.strip().split(',')
        lines.append((l,name))

print lines

1
यदि उनमें से कुछ प्रविष्टियों में अल्पविराम हो तो क्या होगा?
टोनी

@TonyEnnis तब आपको अधिक उन्नत प्रसंस्करण लूप का उपयोग करने की आवश्यकता होगी। ऊपर Maciej द्वारा उत्तर से पता चलता है कि इस ऑपरेशन को करने के लिए पायथन के साथ आने वाले सीएसवी पार्सर का उपयोग कैसे किया जाता है। इस पार्सर की सबसे अधिक संभावना है कि आपको जितने तर्क चाहिए।
हंटर मैकमिलन

1

दुर्भाग्य से मुझे कोई भी मौजूदा जवाब विशेष रूप से संतोषजनक नहीं मिला।

यहां सीएसवी मॉड्यूल का उपयोग करके एक सीधा और पूर्ण पायथन 3 समाधान है ।

import csv

with open('../resources/temp_in.csv', newline='') as f:
    reader = csv.reader(f, skipinitialspace=True)
    rows = list(reader)

print(rows)

skipinitialspace=Trueतर्क पर ध्यान दें । यह आवश्यक है, दुर्भाग्य से, ओपी के सीएसवी में प्रत्येक कॉमा के बाद व्हाट्सएप शामिल है।

आउटपुट:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

0

अपनी आवश्यकताओं को थोड़ा बढ़ाकर और यह मानकर कि आप लाइनों के क्रम की परवाह नहीं करते हैं और उन्हें श्रेणियों के तहत वर्गीकृत करना चाहते हैं, निम्नलिखित समाधान आपके लिए काम कर सकते हैं:

>>> fname = "lines.txt"
>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> with open(fname) as f:
...     for line in f:
...         text, cat = line.rstrip("\n").split(",", 1)
...         dct[cat].append(text)
...
>>> dct
defaultdict(<type 'list'>, {' CatA': ['This is the first line', 'This is the another line'], ' CatC': ['This is the third line'], ' CatB': ['This is the second line', 'This is the last line']})

इस प्रकार आपको कुंजी के अंतर्गत श्रेणी में सभी प्रासंगिक पंक्तियाँ उपलब्ध हैं।


0

यहाँ एक बहु-आयामी सरणी के लिए एक CSV आयात करने के लिए पायथन 3.x में सबसे आसान तरीका है, और कुछ भी आयात किए बिना इसके कोड की केवल 4 पंक्तियाँ!

#pull a CSV into a multidimensional array in 4 lines!

L=[]                            #Create an empty list for the main array
for line in open('log.txt'):    #Open the file and read all the lines
    x=line.rstrip()             #Strip the \n from each line
    L.append(x.split(','))      #Split each line into a list and add it to the
                                #Multidimensional array
print(L)

सावधान रहें, यह एक सूची है, सरणी नहीं! फ़ाइल ऑब्जेक्ट को ठीक से संभालने के लिए एक संदर्भ प्रबंधक का उपयोग क्यों नहीं किया जाता है? ध्यान दें कि यह समाधान प्रत्येक पंक्ति में दूसरे आइटम पर अतिरिक्त व्हाट्सएप छोड़ता है, और यदि कोई भी डेटा अल्पविराम में है तो यह विफल हो जाएगा।
एएमसी

-1

अगला कोड का एक टुकड़ा है जो csv मॉड्यूल का उपयोग करता है, लेकिन पहली पंक्ति का उपयोग करके dicts की सूची में file.csv सामग्री को निकालता है जो csv तालिका का शीर्षलेख है।

import csv
def csv2dicts(filename):
  with open(filename, 'rb') as f:
    reader = csv.reader(f)
    lines = list(reader)
    if len(lines) < 2: return None
    names = lines[0]
    if len(names) < 1: return None
    dicts = []
    for values in lines[1:]:
      if len(values) != len(names): return None
      d = {}
      for i,_ in enumerate(names):
        d[names[i]] = values[i]
      dicts.append(d)
    return dicts
  return None

if __name__ == '__main__':
  your_list = csv2dicts('file.csv')
  print your_list

1
सिर्फ उपयोग क्यों नहीं csv.DictReader?
एएमसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.