2012-05-20 8 views
6

मेरे पास महीनों में लगभग 500GB टेक्स्ट फ़ाइल अलग है। इन पाठ फ़ाइलों में पहली 43 लाइनें सिर्फ कनेक्शन जानकारी हैं (आवश्यक नहीं)। अगली 75 लाइनें अवलोकन के लिए वर्णक हैं। इसके बाद 4 लाइनें (आवश्यक नहीं) तो अगले अवलोकन जो 75 लाइनें हैं।500 जीबी टेक्स्ट फ़ाइल आयात करने का सबसे तेज़ तरीका केवल अनुभाग लेना चाहता था

बात सब मैं चाहता हूँ इन 75 लाइनों (वर्णनकर्ता हर अवलोकन के लिए एक ही स्थान पर हैं), जो इस तरह विशेषता है कर रहे हैं:

ID: 5523 
Date: 20052012 
Mixed: <Null> 
. 
. 

और मैं प्रत्येक के लिए CSV प्रारूप 5523;20052012;;.. करने के लिए इसे बदलना चाहते हैं अवलोकन। ताकि मैं बहुत छोटी टेक्स्ट फाइलों के साथ समाप्त हो जाऊं। चूंकि वर्णनकर्ता एक जैसे हैं, मुझे पता चलेगा कि उदाहरण के लिए पहली स्थिति आईडी है।

एक बार जब मैं टेक्स्ट फ़ाइल के साथ समाप्त करता हूं तो मैं अगला खोलूंगा और इसे जोड़ रहा हूं (या एक नई फाइल को तेज कर दूंगा?)।

मैंने जो किया है वह काफी अक्षम है, मैं फ़ाइल खोल रहा हूं। इसे लोड हो रहा है इन अवलोकनों को लाइन से लाइन पर जा रहा है। यदि यह एक परीक्षण नमूना के साथ एक उचित बिट ले रहा है तो यह स्पष्ट रूप से सबसे अच्छी विधि नहीं है।

कोई भी सुझाव अच्छा होगा।

+1

से क्षेत्रों के साथ एक सूची containg आपकी फ़ाइलों के किसी भी भाग की लंबाई तय कर रहे हैं प्रत्येक प्रविष्टि के साथ info_to_keep नामक एक सूची हो सकती है? –

+0

नोट।सीएसवी का उपयोग करता है, नहीं; –

+0

हां, इसलिए नाम: [सीएसवी, कॉमा सेपरेटेड वैल्यूज] (http://en.wikipedia.org/wiki/Comma-separated_values) – voithos

उत्तर

6

आपने कहा कि आपके पास "लगभग 500GB टेक्स्ट फ़ाइलें हैं।" अगर मैं सही ढंग से समझता हूं, तो आपके पास प्रत्येक अवलोकन के लिए निश्चित लंबाई नहीं है (नोट, मैं लाइन की संख्या के बारे में बात नहीं कर रहा हूं, मेरा मतलब है कि अवलोकन के लिए सभी पंक्तियों के बाइट्स में कुल लंबाई, बाइट्स में) । इसका मतलब है कि आप को पूरी फ़ाइल से गुज़रना होगा, क्योंकि आप नहीं जानते कि न्यूलाइन कहां जा रही है।

अब, प्रत्येक व्यक्तिगत टेक्स्ट फ़ाइल कितनी बड़ी है, इस पर निर्भर करते हुए, आपको एक अलग उत्तर की तलाश करनी पड़ सकती है। लेकिन यदि प्रत्येक फ़ाइल पर्याप्त रूप से छोटी है (1 जीबी से कम?), तो आप linecache मॉड्यूल का उपयोग करने में सक्षम हो सकते हैं, जो आपके लिए खोज-रेखा को संभालता है।

आप इसे शायद इस तरह का उपयोग करेंगे:

import linecache 

filename = 'observations1.txt' 

# Start at 44th line 
curline = 44 
lines = [] 

# Keep looping until no return string is found 
# getline() never throws errors, but returns an empty string '' 
# if the line wasn't found (if the line was actually empty, it would have 
# returned the newline character '\n') 
while linecache.getline(filename, curline): 
    for i in xrange(75): 
     lines.append(linecache.getline(filename, curline).rstrip()) 
     curline += 1 

    # Perform work with the set of observation lines 
    add_to_observation_log(lines) 

    # Skip the unnecessary section and reset the lines list 
    curline += 4 
    lines = [] 

मैं इस का एक परीक्षण करने की कोशिश की, और यह पाँच सेकंड में एक 23MB फ़ाइल के माध्यम से चबाया।

+0

इस मॉड्यूल के लिए मुझे मार्गदर्शन करने के लिए धन्यवाद। डेटा लगभग 1 जीबी अवसर पर थोड़ा बड़ा है लेकिन मुझे लगता है कि इसे अपने आकार के लिए काम करना चाहिए। सूचियों का उपयोग करने से दूर रहने का कारण यह है कि मुझे उन्हें लिखने में समस्या है। आपके कोड से काम करना मैंने इसे अपने उपयोगों के लिए जल्दी से अनुकूलित कर लिया है: – FancyDolphin

+0

जबकि linecache.getline (फ़ाइल नाम, curline): i श्रेणी में (75): data_manipulated = linecache.getline (फ़ाइल नाम, curline) .rstrip() datamanipulated2 = data_manipulated.split (":") datamanipulated2.pop (0) lines.append (datamanipulated2) curline + = 1 /* खुले ('outputfile', "एक") च के रूप में के साथ: ## f.write (लाइनें)/* यह आपको एक त्रुटि देता है कि 'सूची' ऑब्जेक्ट में कोई विशेषता नहीं है 'लिखें' – FancyDolphin

+0

इसलिए मैंने चालाक होने का फैसला किया .... और निम्न कोशिश की: f = print (','। शामिल हों (मानचित्र (str, रेखाएं)) फिर आपको फोल मिलता है कम त्रुटि त्रुटि टाइपर: str होना चाहिए, _io.TextIOWrapper मुझे लगता है कि चांदनी बहुत आसान है लेकिन मुझे यह याद आ रही है, कोई सुझाव? लाइनकेचे मॉड्यूल के लिए फिर से धन्यवाद। – FancyDolphin

2

opening the file. Loading it. Deleting these observations going line by line.

आप "यह लोड हो रहा है" से क्या मतलब है? यदि आप पूरी चीज को एक स्ट्रिंग में पढ़ना चाहते हैं, तो हाँ यह चूसने जा रहा है।

for line in file: 
    if should_use(line): do_something_with(line) 
0

आप जानकारी आप एक डेटाबेस में रखना चाहते हैं लिखने पर विचार करना चाहिए: प्राकृतिक तरीके से फ़ाइल को संभालने के लिए तथ्य का लाभ लेने के लिए उस फ़ाइल वस्तु फ़ाइल की तर्ज पर एक इटरेटर है। पायथन में आप sqlite3 का उपयोग कर सकते हैं जो कि बनाया गया है। docs को समझना आसान है।

आप कहते हैं कि अब आप प्रत्येक फ़ाइल में बिल्कुल लाइनें हैं, जिन्हें आप रखना चाहते हैं। तो आप इस तरह कुछ कोशिश कर सकते हैं।

import csv 
    reader = csv.reader(open("afile.csv","rb"),delimiter="\t",quotechar='"') 
    info_to_keep = [] 
    obs = [] 
    for row in reader: 
     i+=1 
     if i<43: 
      continue 
     elif i-43 <79*(len(info_to_keep)+1)-4: 
      obs.append(row) 
     elif i-43 <79*(len(info_to_keep)+1): 
      continue 
     else: 
      info_to_keep.append(obs) 
      obs = [row] 

इस तरह आप 75 प्रविष्टियों के साथ एक सूची से युक्त, प्रत्येक सीएसवी फ़ाइल

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

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