2012-03-22 4 views
9

मेरे एक मित्र को बहुत सारे डेटा (लगभग 18000 डेटा सेट) पढ़ने की आवश्यकता है जो सभी को परेशान रूप से स्वरूपित किया गया है। विशेष रूप से डेटा को डेटा के 8 कॉलम और ~ 8000 पंक्तियां माना जाता है, लेकिन इसके बजाय डेटा को अगली पंक्ति के पहले कॉलम में अंतिम प्रविष्टि के साथ 7 के कॉलम के रूप में वितरित किया जाता है।पायथन: कॉलम की असमान संख्या के साथ डेटा फ़ाइल को कैसे पढ़ा जाए

इसके अलावा प्रत्येक ~ 30 पंक्तियों में केवल 4 कॉलम हैं। ऐसा इसलिए है क्योंकि कुछ अपस्ट्रीम प्रोग्राम 7x8120 सरणी में 200 x 280 सरणी को दोबारा बदल रहा है।

मेरा प्रश्न यह है: हम डेटा को 8x7000 सरणी में कैसे पढ़ सकते हैं। असमान संख्या में कॉलम होने पर np.loadtxt और np.genfromtxt का मेरा सामान्य शस्त्रागार विफल रहता है।

ध्यान रखें कि प्रदर्शन एक कारक है क्योंकि इसे ~ 18000 डेटाफाइल के लिए किया जाना है। http://users-phys.au.dk/hha07/hk_L1.ref

+0

स्पष्टीकरण के लिए: प्रत्येक 24 पंक्तियों में प्रत्येक कॉलम में आठ कॉलम के निरंतर "बहने" की वजह से 4 कॉलम पंक्ति होती है। सही? 24 * 7 + 4 के प्रत्येक ब्लॉक में 200 आइटम होते हैं, जो समान रूप से विभाजित होते हैं 8. –

+1

एक उदाहरण बहुत उपयोगी होगा। –

+1

अच्छी HDF5 फ़ाइलों को आउटपुट करने के लिए अपस्ट्रीम प्रोग्राम को ठीक करने के बारे में, या कम से कम कुछ कम पागल? –

उत्तर

11

एक और भी आसान दृष्टिकोण मैं बस के बारे में सोचा:

with open("hk_L1.ref") as f: 
    data = numpy.array(f.read().split(), dtype=float).reshape(7000, 8) 

यह एक आयामी सरणी के रूप में डेटा पढ़ता पहले, पूरी तरह से सभी नए-लाइन पात्रों की अनदेखी, और फिर हम यह वांछित आकार के नयी आकृति प्रदान।

जबकि मुझे लगता है कि यह कार्य I/O- बाध्य होगा, इस दृष्टिकोण को यदि आवश्यक हो तो थोड़ा प्रोसेसर समय का उपयोग करना चाहिए।

0

यह कैसे के बारे में:

यहाँ एक ठेठ डेटा फ़ाइल के लिए एक लिंक है?

data = [] 
curRow = [] 
dataPerRow = 8 
for row in FILE.readlines(): 
    for item in row.split(): 
     if len(curRow) == dataPerRow: 
      data.append(curRow) 
      curRow = [] 
     curRow.Append(item) 

data.append(curRow) 

फिर आप सूचियों, जो जो कुछ के लिए इस्तेमाल किया जा सकता की एक सूची है (यह मानते हुए फ़ाइल फ़ाइल में पढ़ा जा रहा है)।

1

परंतु मैं तुम्हें सही ढंग से समझ में आ (मेरी टिप्पणी देखें) आप टोकन में अपने इनपुट विभाजित कर सकते हैं, तो आठ अस्पष्टता से के ब्लॉक में इसे संसाधित:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

f = open('filename.ref') 
tokens = f.read().split() 

rows = [] 
for idx, token in enumerate(tokens): 
    if idx % 8 == 0: 
     # this is a new row, use a new list. 
     row = [] 
     rows.append(row) 
    row.append(token) 

# rows is now a list of lists with the desired data. 

यह मेरे कंप्यूटर में 0.2 सेकंड से कम में चलाता है के रूप में।

संपादित करें: @ SvenMarnach के सुझाव का उपयोग किया गया।

+0

आप यहां 'shlex' का उपयोग क्यों कर रहे हैं? एक सरल 'str.split() 'चाल करेगा। –

+0

@ स्वेनमार्कैच: मैंने सोचा कि यह आसान था क्योंकि यह फ़ाइल से टोकन की एक अंतहीन धारा प्रस्तुत करता है। 'Line.split()' के साथ, मुझे ओपी वर्णित 8-कॉलम-इन -7 अंक के कारण वर्तमान ऑफसेट का ट्रैक रखने के लिए फ़ाइल को फिर से चालू करना होगा। या तो जनरेटर को लिखना या लिखना, मुझे लगता है, लेकिन यह काफी है जो मैं यहां के लिए श्लेक्स का उपयोग करता हूं। अगर मैं पीछा नहीं कर रहा हूं तो कृपया मुझे बताएं! –

+0

बस 'f.read()। Split() 'का उपयोग करें, और आप कर चुके हैं। –

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