एक सूची में एक पाठ फ़ाइल या पायथन के साथ एक सरणी को कैसे पढ़ें


176

मैं एक पाठ फ़ाइल की पंक्तियों को एक सूची या सरणी में अजगर में पढ़ने की कोशिश कर रहा हूं। मैं बस सूची या सरणी में किसी भी आइटम को निर्मित करने के बाद व्यक्तिगत रूप से उपयोग करने में सक्षम होना चाहिए।

पाठ फ़ाइल निम्नानुसार स्वरूपित है:

0,0,200,0,53,1,0,255,...,0.

जहां ...ऊपर है, वहां वास्तविक पाठ फ़ाइल में सैकड़ों या हजारों अधिक आइटम हैं।

फ़ाइल को सूची में पढ़ने का प्रयास करने के लिए मैं निम्नलिखित कोड का उपयोग कर रहा हूं:

text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()

मुझे जो आउटपुट मिलता है वह है:

['0,0,200,0,53,1,0,255,...,0.']
1

जाहिरा तौर पर यह पूरी फाइल को केवल एक आइटम की सूची में पढ़ रहा है, बजाय व्यक्तिगत वस्तुओं की सूची के। मैं क्या गलत कर रहा हूं?


1
बस एक नोट के रूप में। ऐसा लगता है कि इस सवाल को फिर से परिभाषित किया जाना चाहिए कि पायथन में एक सूची में एक सीएसवी फ़ाइल कैसे पढ़ें। लेकिन मैं 4 साल पहले ओपी के मूल इरादों को टालता हूं जो मुझे नहीं पता।
डेमोन्गोलम



1
वास्तव में, शीर्ष उत्तर को देखते हुए, यह stackoverflow.com/questions/3277503/… का एक डुप्लिकेट है ।
एएमसी

जवाबों:


135

आपको अपने स्ट्रिंग को उपयोग करने वाले मानों की सूची में विभाजित करना होगा split()

इसलिए,

lines = text_file.read().split(',')

1
मुझे लगता है कि इस जवाब को बेहतर बनाया जा सकता है ... आप एक बहु पर विचार करें .csvफ़ाइल (के रूप में ओ पी ने उल्लेख किया), उदाहरण के लिए, एक फ़ाइल पंक्ति द्वारा वर्णमाला वर्ण 3 युक्त ( a,b,c, d,e,f, आदि) और प्रक्रिया आप क्या मिलता है ऊपर वर्णित लागू इस तरह एक सूची है: ['a', 'b', 'c\nd', 'e', ... ](आइटम पर ध्यान दें 'c\nd')। मैं यह जोड़ना चाहूंगा कि, उपरोक्त समस्या के बावजूद, यह प्रक्रिया एकल मेगा-सूची में अलग-अलग पंक्तियों से डेटा को ढहती है, आमतौर पर रिकॉर्ड-उन्मुख डेटा फ़ाइल को संसाधित करते समय मुझे जो चाहिए वह नहीं होता है।
गब्फी

विभाजन नई सुर्खियों को छोड़ने वाला है। इस, उपयोग मत करो csvमॉड्यूल या कुछ अन्य मौजूदा पार्सर
जीन फ़्राँस्वा Fabre

42

तुम भी जैसे numpy loadtxt का उपयोग कर सकते हो

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)

1
मुझे भी यही चाहिए। मैंने एक रास्पबेरी पाई पर ध्यान दिया कि सुन्न वास्तव में धीमी गति से काम करती है। इस एप्लिकेशन के लिए मैंने एक फ़ाइल खोलने के लिए रिवर्ट किया और उसे लाइन से लाइन पढ़ा।
गुस

2
यह dtype : data-typeपैरामीटर के माध्यम से प्रारूप को भी निर्दिष्ट करने के लिए उपयोगी है । docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html पंडों read_csv का उपयोग करना बहुत आसान है। लेकिन मुझे इसके लिए प्रारूप निर्दिष्ट करने का कोई तरीका नहीं दिखाई दिया। यह मेरी फाइल से फ्लोट पढ़ रहा था, जबकि मुझे स्ट्रिंग की आवश्यकता थी। धन्यवाद @Tiru लोडटैक्स दिखाने के लिए।
ओजगुर Ozturk

1
यदि txt फ़ाइलों में तार होते हैं, तो dtype निर्दिष्ट किया जाना चाहिए, इसलिए यह लाइनों की तरह होना चाहिए = loadtxt ("filename.dat", dtype = str, comments = "#", delimiter = ",",
unm

19

इसलिए आप सूचियों की एक सूची बनाना चाहते हैं ... हमें एक खाली सूची के साथ शुरुआत करने की आवश्यकता है

list_of_lists = []

अगला, हम फ़ाइल सामग्री पढ़ते हैं, लाइन से लाइन

with open('data') as f:
    for line in f:
        inner_list = [elt.strip() for elt in line.split(',')]
        # in alternative, if you need to use the file content as numbers
        # inner_list = [int(elt.strip()) for elt in line.split(',')]
        list_of_lists.append(inner_list)

एक सामान्य उपयोग का मामला स्तंभ डेटा है, लेकिन हमारी स्टोरेज इकाइयाँ फ़ाइल की पंक्तियाँ हैं, जिन्हें हमने एक-एक करके पढ़ा है, इसलिए आप अपनी सूचियों की सूची को बदलना चाह सकते हैं । यह निम्नलिखित मुहावरे के साथ किया जा सकता है

by_cols = zip(*list_of_lists)

एक और आम उपयोग प्रत्येक स्तंभ को एक नाम देना है

col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
    by_names[col_name] = by_cols[i]

ताकि आप सजातीय डेटा आइटम पर काम कर सकें

 mean_apple_prices = [money/fruits for money, fruits in
                     zip(by_names['apples revenue'], by_names['apples_sold'])]

मैंने जो भी लिखा है, उसमें से अधिकांश csvको मानक पुस्तकालय से मॉड्यूल का उपयोग करके गति दी जा सकती है । एक और तीसरा पक्ष मॉड्यूल है pandas, जो आपको एक विशिष्ट डेटा विश्लेषण के अधिकांश पहलुओं को स्वचालित करने देता है (लेकिन कई निर्भरताएं हैं)।


अद्यतन करें जबकि पायथन 2 zip(*list_of_lists)में सूचियों की एक अलग (ट्रांसपोज़्ड) सूची मिलती है, पायथन 3 में स्थिति बदल गई है और एक ज़िप ऑब्जेक्टzip(*list_of_lists) लौटाता है जो सबस्क्रिप्टेबल नहीं है।

यदि आपको अनुक्रमित पहुंच की आवश्यकता है तो आप उपयोग कर सकते हैं

by_cols = list(zip(*list_of_lists))

यह आपको पायथन के दोनों संस्करणों की सूची देता है।

दूसरी ओर, यदि आपको अनुक्रमित पहुंच की आवश्यकता नहीं है और आप जो चाहते हैं, वह सिर्फ कॉलम नामों द्वारा अनुक्रमित शब्दकोश बनाने के लिए है, एक ज़िप ऑब्जेक्ट ठीक है ...

file = open('some_data.csv')
names = get_names(next(file))
columns = zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in zip(names, columns): d[name] = column

ओपी ने कहा कि वे सीएसवी से डेटा की एक सूची चाहते थे, न कि "सूचियों की सूची"। बस csvमॉड्यूल का उपयोग करें ...
Blairg23

4

यह सवाल पूछ रहा है कि फ़ाइल से कॉमा-से-अलग मूल्य की सामग्री को एक पुनरावृत्त सूची में कैसे पढ़ा जाए:

0,0,200,0,53,1,0,255,...,0.

ऐसा करने का सबसे आसान तरीका csvमॉड्यूल निम्नानुसार है:

import csv
with open('filename.dat', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')

अब, आप spamreaderइस तरह से आसानी से पुनरावृति कर सकते हैं :

for row in spamreader:
    print(', '.join(row))

अधिक उदाहरणों के लिए प्रलेखन देखें ।

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