2012-10-21 12 views
7

मेरे पास डेटा के कॉलम के साथ एक टेक्स्ट फ़ाइल है और मुझे इन कॉलम को अलग-अलग सूचियों या सरणी में बदलने की आवश्यकता है। यह मैं क्या अब तकपायथन में रीडलाइन का उपयोग करना? पहली बार

f = open('data.txt', 'r') 
temp = [] 
for row in f.readlines(): 
    Data = row.split() 
    temp.append(float(Data[0])) 

है जब मैं इस चलाने मैं IndexError: list index out of range मिलता है।

नीचे डेटा के स्निपेट:

16 0.2000 
17 0.3000 
18 0.4000 
20 0.5000 
21 0.6000 
22 0.7000 
24 0.8000 
25 0.9000 
26 1.000 

मैं पहले कॉलम की जरूरत है, यदि संभव हो तो इस तरह देखने के लिए: डाटा = [16, 17, 18, 20, 21, 22, 24, 25, 26]

+4

['csv'] (http://docs.python.org/library/csv.html) आपका मित्र है। –

+1

... यह f.readlines() में पंक्ति के लिए नहीं होना चाहिए: 'या अधिक आसानी से' f में पंक्ति के लिए '? – nneonneo

उत्तर

5

यदि आप खाली पंक्ति पढ़ते हैं तो आपको खाली सूची Data=[] मिल रही है। आप Data[0] का उपयोग कर सूची से पहला तत्व प्राप्त करने का प्रयास करते हैं, लेकिन क्योंकि यह एक खाली सूची है, इसकी स्थिति 0 पर कोई तत्व नहीं है, इसलिए आपको IndexError मिलता है।

Data=''.split() 

Data[0] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-686-0792b03cbbdf> in <module>() 
----> 1 Data[0] 

IndexError: list index out of range 

यह बाहर DataIndexError अगर occours प्रिंट होगा - आप अपने आप को देख सकते हैं कि यह एक खाली सूची प्रिंट:

f=open('file','r') 
temp = [] 
for row in f.readlines(): 
    Data = row.split() 
    try: 
     temp.append(float(Data[0])) 
    except IndexError: 
     print Data 

आप फ़ाइल को खोलने का with कथन का उपयोग कर सकते हैं, जो स्वत: बंद संसाधित होने के बाद फ़ाइल। readlines() का उपयोग किए बिना, आप फ़ाइल पर ही लूप कर सकते हैं।

with open(file,'r') as f:   
    for row in f: 
     Data = row.split() 
     try: 
      print Data[0] 
     except IndexError: 
      print 'You have an empty row' 

संपादित करें: आप सीएसवी मॉड्यूल का उपयोग करने का बेहतर कर रहे हैं:

import csv 
with open('file.csv', 'rb') as f: 
    reader = csv.reader(f, delimiter=' ') 
    print [row[0] for row in reader if len(row)] 
>>> 
['16', '17', '18', '20', '21', '22', '24', '25', '26'] 
+0

आपकी प्रतिक्रिया और सुझावों के लिए बहुत बहुत धन्यवाद। क्या कोई तरीका है कि मैं डेटा को इस तरह के सूची रूप में प्राप्त कर सकता हूं: डेटा = [0, 1, आदि]? – user1762768

+0

मैं सिर्फ डेटा को सूची में लाने की कोशिश कर रहा हूं क्योंकि मुझे इसे रैखिक इंटरपोलेशन करने के लिए उपयोग करने की आवश्यकता है। यदि मैंने आपके द्वारा सुझाई गई अंतिम विधि का उपयोग किया है, ('साथ' का उपयोग करके) क्या यह मुझे एक सूची देगा जो मैं बाद में अपने इंटरपोलेशन में उपयोग कर सकता हूं? 0,1, आदि – user1762768

+0

आयात किए जाने वाले डेटा मानों के उदाहरण थे, यदि आप इंटरपोलेशन का उपयोग करना चाहते हैं तो पांडा पुस्तकालय (यह सीएसवी से डेटा को आयात कर सकता है) पर एक नज़र डालें, यहां पांडा का उपयोग करके एक इंटरपोलेशन उदाहरण है पिछले प्रश्न का उत्तर http://stackoverflow.com/questions/12982792/interpolate-number-sequence/12983037#12983037 – root

2

filehandlers के लिए के साथ प्रयोग।

with open('path/to/file', 'r') as f: 
    for line in f: 
     # code. 

आप सूचकांक त्रुटि [0] स्थान पर Data पहुंचने का प्रयास कर से आता है। जिसका अर्थ है कि आपकी लाइन खाली थी।

आप लाइन पार्स करने से पहले एक त्वरित जांच चलाना चाहिए ...

if len(Data): 
    #code 
else: 
    #empty line? 
+1

पाइथन में काम करता है, तो 'अगर लेन (डेटा):' और नहीं 'लिखना बेहतर है, तो लेन (डेटा)> 0: '। –

+0

@ बुरहान खालिद - क्या आप तब कर सकते हैं अगर डेटा :? – root

+0

@root no, क्योंकि एक खाली सूची अभी भी मौजूद है। '>>> ए = []' '>>> प्रिंट करें '' [] ' –

0
f = open('data.txt', 'r') 
temp = [] 
for row in f.readlines(): 
    items = row.split(',') 
    temp.append(unicode(items[0])) 

मुझे आशा है कि यह आपकी समस्या नहीं सुलझती।

0
def cal(num_list): 
    x = 1; 
    z = 0; 
    while True: 
     list1 = list(str(x)) 
     list2 = [int(a) for a in list1] 

     for i in range(len(list2)): 
      for j in range(10): 
       if(list2.count(j) > num_list[list2[i]]): 
        z = 1; 
        break; 
     if(z == 1): 
      save(x); 
      break;  
     x = x + 1; 
0
#matrix A to B 
def show(): 
    global string_final,list_2,tot 
    index=matrix_1.index(num) # finding index of num 

    length=n 
    j=(index)%length # the column positon 
    i=index/length # the row position 

    list_1=[] 
    for a in range(length): 
     lis=[] 
     for b in range(length): 

      lis.append(matrix_1.pop(0)) #pop the first element and append the list 

     list_1.append(lis) 

    tot=0 
    list_2=[] 

    for a in range(i+1): 
     for b in range(j+1): 
      tot=tot+list_1[a][b] # add the numbers 
      list_2.append(list_1[a][b]) #append to list 
      if(b!=length): 
       list_2.append(" ") #append space 
     list_2.append("\n") 
    string_final="".join([str(a) for a in list_2]) #list to string 


    print "matrix B\n",string_final,"\nx: ",str(num),"\nn: ",str(n)+"\ntotal: "+str(tot) # print the result 
+0

#mat एक बी करने के लिए डीईएफ़ savefile() "\ NX:" + str (num) + "\ nn:" + str (n) + "\ ntotal:" + str (tot)) file.close(); x = 1 जबकि एक्स == 1: getInput() अगर (एन <=0 or n> = 20): n प्रिंट के लिए #check "दर्ज सही n" तोड़ अगर (लेन (matrix_1) = एन * एन या लेन (सेट (matrix_1)) = = लेन (matrix_1)): # इनपुट जांचें ठीक है या नहीं प्रिंट "गलत इनपुट" ब्रेक अगर (सेट ([99> ए> 9 में matrix_1 के लिए ])! = {True}): # n प्रिंट "उचित संख्या दर्ज करें" ब्रेक शो() saveFile() x = x + 1; – user4816019

+0

टिप्पणियां कोड स्वरूपण को नष्ट कर देती हैं, खासकर व्हाइटस्पेस-महत्वपूर्ण भाषाओं में। अतिरिक्त कोड शामिल करने के लिए कृपया अपना उत्तर संपादित करें। –

0
#matrix add zero 
def get(): 
    global b_no 
    num_list=[]; 
    file=open("matrix.txt","r"); 
    for i in file: 
     b_no=0 
     if(len(i.split())==1): #check length is 1 or not 
      n=int(i)#string to int 
     else: 
      temp=i.split(); 
      if(len(temp)!=n): 
       b_no+=1 
       break 
      temp=[0]+[int(a) for a in temp]+[0] #add zero at first and last 
      num_list.append(temp); 

    zero_list=[] 

    for i in range(n+2): 
     zero_list.append(0)   #append zero 
    num_list.insert(0,zero_list) 
    num_list.insert(n+1,zero_list) 
    return num_list,n; 
+0

#mat शून्य जोड़ें # डीफ़ कैल(): सूची 1 = []; पंक्ति में पंक्ति के लिए (1, एन + 1): कॉल में रेंज (1, एन + 1): कुल = 0; गिनती = 0; श्रेणी में मीटर के लिए (-1,2): पी श्रेणी में (-1,2): यदि (num_list [पंक्ति + मीटर] [col + p] == 0): गिनती = गिनती + 1; कुल = कुल + num_list [पंक्ति + मीटर] [col + p]; अगर (गिनती! = 0): कुल = कुल/(9-गिनती); अन्य: कुल = कुल/9 list1.append (str (tot) + ""); list1.append ("\ n"); प्रिंट "" .join ([str) ए सूची में एक के लिए 1]) – user4816019

+0

x = 1; जबकि x == 1: num_list, n = get(); अगर (एन> 20 या एन <3): प्रिंट "एन 3 और 20 के बीच होना चाहिए" ब्रेक अगर (b_no!= 0): प्रिंट "सही ढंग से दर्ज करें" ब्रेक कैल() x = x + 1; – user4816019

+1

आपको पता है कि एक * संपादन * विकल्प है, है ना? – livibetter

0

मैं का उपयोग कर डेटा [0] या पंक्ति [0], बजाय, मैं प्रयोग करेंगे '' .join (डेटा) या '' .join (पंक्ति) खाली से बचने के लिए से बचने के हैं सूची (श्रेणी त्रुटि से सूची सूचकांक)।

संबंधित मुद्दे