पायथन सीएसवी स्ट्रिंग से सरणी तक


187

किसी को भी एक साधारण पुस्तकालय या फ़ंक्शन का पता है जो एक सीएसवी एन्कोडेड स्ट्रिंग को पार्स करने के लिए और इसे एक सरणी या शब्दकोश में बदल सकता है?

मुझे नहीं लगता कि मैं सीएसवी मॉड्यूल का निर्माण करना चाहता हूं क्योंकि सभी उदाहरणों में मैंने देखा है कि फाइलपथ लेता है, तार नहीं।

जवाबों:


259

आप स्ट्रिंग का उपयोग करके किसी फ़ाइल ऑब्जेक्ट में परिवर्तित कर सकते हैं io.StringIOऔर फिर उस csvमॉड्यूल को पास कर सकते हैं :

from io import StringIO
import csv

scsv = """text,with,Polish,non-Latin,letters
1,2,3,4,5,6
a,b,c,d,e,f
gęś,zółty,wąż,idzie,wąską,dróżką,
"""

f = StringIO(scsv)
reader = csv.reader(f, delimiter=',')
for row in reader:
    print('\t'.join(row))

नए संस्करणों के साथ सरल संस्करण split():

reader = csv.reader(scsv.split('\n'), delimiter=',')
for row in reader:
    print('\t'.join(row))

या आप split()इस स्ट्रिंग \nको विभाजक के रूप में उपयोग कर लाइनों में , और फिर split()प्रत्येक पंक्ति को मूल्यों में बदल सकते हैं, लेकिन इस तरह से आपको उद्धरण के बारे में पता होना चाहिए, इसलिए csvमॉड्यूल का उपयोग करना पसंद किया जाता है।

पर पायथन 2 आप आयात करने के लिए है StringIOके रूप में

from StringIO import StringIO

बजाय।


6
विभाजन विधि काम नहीं करेगी अगर उसकी सीएसवी फ़ाइल में तार होते हैं जिसमें कॉमा होता है
कार्सन मायर्स

3
या मूल्यों (अल्पविराम के साथ या बिना) के रूप में तार उद्धृत
adamk

28
पायथन 3 अब io.StringIO का उपयोग करता है। (उम्मीद है कि पायथन 3 उपयोगकर्ताओं को थोड़ा समय बचाएं)। इसलिए आयात io और io.StringIO।
JStrahl

3
इसके बजाय .split('\n'), आप उपयोग कर सकते हैं .splitlines()
डेनिलसन सिया मिया

1
नहीं, यह ogonki साथ :-) पोलिश पत्र के साथ बहुत अच्छी तरह से काम करता है
मीकल निकलस

70

सरल - सीएसवी मॉड्यूल सूचियों के साथ भी काम करता है:

>>> a=["1,2,3","4,5,6"]  # or a = "1,2,3\n4,5,6".split('\n')
>>> import csv
>>> x = csv.reader(a)
>>> list(x)
[['1', '2', '3'], ['4', '5', '6']]

4
जानने के लिए अच्छा है, लेकिन ध्यान रखें कि .split('\n')अगर आपके खेतों में नई-नई चीजें हैं तो वे अजीबोगरीब काम करेंगे।
इनामाथी

1
@ इमानाथी, अगर यह सीएसवी है, तो अंदर की नई सुचनाओं से बच जाना चाहिए।
जॉन ला रूय

यदि फ़ील्ड उद्धृत की जाती है, तो Newlines को भागने की आवश्यकता नहीं है।
जोनाथन

1
यह कार्यक्षमता अच्छी तरह से प्रलेखित नहीं है। धन्यवाद।
काउललाइनर

13

csv.reader() Https://docs.python.org/2/library/csv.html के लिए आधिकारिक दस्तावेज़ बहुत मददगार है, जो कहता है

फ़ाइल ऑब्जेक्ट और सूची ऑब्जेक्ट दोनों उपयुक्त हैं

import csv

text = """1,2,3
a,b,c
d,e,f"""

lines = text.splitlines()
reader = csv.reader(lines, delimiter=',')
for row in reader:
    print('\t'.join(row))

11
>>> a = "1,2"
>>> a
'1,2'
>>> b = a.split(",")
>>> b
['1', '2']

CSV फ़ाइल को पार्स करने के लिए:

f = open(file.csv, "r")
lines = f.read().split("\n") # "\r\n" if needed

for line in lines:
    if line != "": # add other needed checks to skip titles
        cols = line.split(",")
        print cols

'सरल जटिल से बेहतर है!'
अब्देलउहाब

9
-1 इस समाधान के साथ मुद्दा यह है कि यह "स्ट्रिंग एस्केपिंग" को ध्यान में नहीं रखता है, अर्थात 3, "4,5,6, 6इसे पाँच के बजाय तीन क्षेत्रों के रूप में माना जाएगा।
Zz'Rot

सरल लेकिन केवल कुछ विशिष्ट मामलों में काम करता है, यह जेनेरिक CSV पार्सिंग कोड नहीं है
क्रिस्टोफ रूसो

8

जैसा कि दूसरों ने पहले ही बताया है, पायथन में CSV फ़ाइलों को पढ़ने और लिखने के लिए एक मॉड्यूल शामिल है। यह बहुत अच्छा काम करता है जब तक कि ASCII सीमा के भीतर इनपुट वर्ण बने रहते हैं। यदि आप अन्य एन्कोडिंग को संसाधित करना चाहते हैं, तो अधिक काम करने की आवश्यकता है।

सीएसवी मॉड्यूल के लिए अजगर प्रलेखन औजार csv.reader का ही विस्तार है, जो एक ही इंटरफ़ेस का उपयोग करता है लेकिन अन्य एनकोडिंग और रिटर्न तार यूनिकोड संभाल कर सकते हैं। बस प्रलेखन से कोड को कॉपी और पेस्ट करें। उसके बाद, आप एक सीएसवी फ़ाइल को इस तरह से संसाधित कर सकते हैं:

with open("some.csv", "rb") as csvFile: 
    for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
        print row

सुनिश्चित करें कि यूनिकोड फ़ाइल में BOM (बाइट ऑर्डर मार्कर) नहीं है
पियरे

1
BOM के संबंध में: पाइथन को UTF-32, UTF-16 आदि में आधिकारिक BOM का पता लगाना और छोड़ देना चाहिए। UTF-8 के लिए अनौपचारिक Microsoft BOM को छोड़ देने के 'utf-8-sig'बजाय, कोडेक के रूप में उपयोग करें 'utf-8'
रोस्कैकोरी

7

प्रति प्रलेखन:

और जबकि मॉड्यूल सीधे पार्सिंग स्ट्रिंग्स का समर्थन नहीं करता है, यह आसानी से किया जा सकता है:

import csv
for row in csv.reader(['one,two,three']):
    print row

बस अपनी स्ट्रिंग को एक एकल तत्व सूची में बदल दें।

जब स्ट्रिंग में यह उदाहरण स्पष्ट रूप से है, तो StringIO आयात करना मेरे लिए थोड़ा अधिक लगता है।


3

https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader

csvfile कोई भी वस्तु हो सकती है जो इट्रेटर प्रोटोकॉल का समर्थन करती है और हर बार इसकी अगली () विधि से एक स्ट्रिंग लौटाती है

इस प्रकार, एक StringIO.StringIO(), str.splitlines()या यहां तक ​​कि एक जनरेटर सभी अच्छे हैं।


2

यहाँ एक वैकल्पिक समाधान है:

>>> import pyexcel as pe
>>> text="""1,2,3
... a,b,c
... d,e,f"""
>>> s = pe.load_from_memory('csv', text)
>>> s
Sheet Name: csv
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| a | b | c |
+---+---+---+
| d | e | f |
+---+---+---+
>>> s.to_array()
[[u'1', u'2', u'3'], [u'a', u'b', u'c'], [u'd', u'e', u'f']]

यहाँ प्रलेखन है


2

सूची में एक सीएसवी लोड होने के लिए इसका उपयोग करें

import csv

csvfile = open(myfile, 'r')
reader = csv.reader(csvfile, delimiter='\t')
my_list = list(reader)
print my_list
>>>[['1st_line', '0'],
    ['2nd_line', '0']]

0

पांडा पायथन में सीएसवी पढ़ने के लिए काफी शक्तिशाली और स्मार्ट लाइब्रेरी है

यहाँ एक साधारण उदाहरण, मेरे पास example.zip फ़ाइल है जिसमें चार फाइलें हैं।

EXAMPLE.zip
 -- example1.csv
 -- example1.txt
 -- example2.csv
 -- example2.txt

from zipfile import ZipFile
import pandas as pd


filepath = 'EXAMPLE.zip'
file_prefix = filepath[:-4].lower()

zipfile = ZipFile(filepath)
target_file = ''.join([file_prefix, '/', file_prefix, 1 , '.csv'])

df = pd.read_csv(zipfile.open(target_file))

print(df.head()) # print first five row of csv
print(df[COL_NAME]) # fetch the col_name data

आपके पास डेटा होने के बाद आप सूची या अन्य प्रारूपों के साथ खेलने के लिए हेरफेर कर सकते हैं।

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