2011-10-21 12 views
14

साथ फ़ाइल मैं वर्तमान में एक CSV फ़ाइल, जो जब Excel में खोला, 5 कॉलम में कुल की है। केवल कॉलम ए और सी मेरे लिए किसी भी महत्व के हैं और शेष कॉलम में डेटा अप्रासंगिक है।पार्सिंग सीएसवी/टैब सीमांकित txt अजगर

लाइन 8 से शुरू करना और फिर 7 के गुणकों में काम करना (यानी लाइन 8, 15, 22, 2 9, 36 आदि ...), मैं इन क्षेत्रों से जानकारी के साथ पायथन 2.7 के साथ एक शब्दकोश बनाना चाहता हूं । कॉलम ए में डेटा कुंजी (6-अंकों का पूर्णांक) होगा और कॉलम सी में डेटा कुंजी के लिए संबंधित मान होगा। मैं नीचे इस को उजागर करने की कोशिश की है लेकिन स्वरूपण सबसे अच्छा नहीं है: -

A  B  C   D 
1       CDCDCDCD 
2       VDDBDDB 
3 
4 
5 
6 
7 DDEFEEF     FEFEFEFE 
8 123456   JONES 
9 
10 
11 
12 
13 
14 
15 293849   SMITH 

ऊपर के अनुसार, मैं अपने शब्दकोश और में एक महत्वपूर्ण के रूप में ए 7 (DDEFEEF) से मान प्राप्त "करने के लिए देख रहा हूँ FEFEFEFE "संबंधित डेटा जा रहा है और उसके बाद मेरे शब्दकोश में एक और प्रविष्टि जोड़ने, के साथ 15 लाइन पर कूद" 2,938,495 स्मिथ "संबंधित मान से किया जा रहा है" मेरे कुंजी और जा रहा है "।

कोई सुझाव? स्रोत फ़ाइल एक .txt फ़ाइल है जिसमें प्रविष्टियां टैब-डिलीमिट होती हैं। धन्यवाद

स्पष्टीकरण:

बस स्पष्ट करने के लिए, अब तक, मैं नीचे की कोशिश की है: -

import csv 

mydict = {:} 
f = open("myfile", 'rt') 
reader = csv.reader(f) 
    for row in reader: 
     print row 

ऊपर बस एक समय में हालांकि एक पंक्ति सभी सामग्री बाहर प्रिंट करता है। मैंने "पाठक में पंक्ति (7) के लिए" कोशिश की "लेकिन यह एक त्रुटि लौटा दी। सूचियों की एक सूची में पाठ बदल कर

import csv 
from itertools import islice 

entries = csv.reader(open("myfile", 'rb')) 
mydict = {'key' : 'value'} 

for i in xrange(6): 
    mydict['i(0)] = 'I(2) # integers representing columns 
    range = islice(entries,6) 
    for entry in range: 
     mydict[entries(0) = entries(2)] # integers representing columns 
+0

@jdigital - मूल प्रश्न शामिल करने के लिए मैं क्या कोशिश की है संपादित अब तक – thefragileomen

+0

"लाइन 8 से शुरू होने वाले" नहीं "ए 7" के साथ संगत, "6 अंकों पूर्णांक" है "डीडीईएफईएफ" के साथ संगत नहीं है - कृपया अपना प्रश्न संपादित करें। –

+0

@ जॉन माचिन - ए 7 वह सेल नहीं है जिसे मैं डेटा निकालना चाहता हूं, यह ए 8 है। ए 7 में डेटा बस आपको एक उदाहरण देने के लिए है जो मेरी सीएसवी फ़ाइल में अन्य डेटा मौजूद है। चूंकि यह 6 अंकों का पूर्णांक नहीं है, इसे अनदेखा किया जाना है। धन्यवाद – thefragileomen

उत्तर

43

प्रारंभ: मैं तो यह शोध किया और नीचे में एक जाना था, लेकिन यह न तो काम नहीं किया। यही कारण है कि पार्स करने भाग का ख्याल रखना होगा:

lol = list(csv.reader(open('text.txt', 'rb'), delimiter='\t')) 

बाकी अनुक्रमित लुकअप के साथ किया जा सकता है:

d = dict() 
key = lol[6][0]  # cell A7 
value = lol[6][3] # cell D7 
d[key] = value  # add the entry to the dictionary 
... 
+2

लूप के साथ एक साथ महान काम किया। धन्यवाद – thefragileomen

2

तो फ़ाइल बड़ी है, आप एक बार में स्मृति में यह पूरी तरह से लोड करने के लिए नहीं चाहते हो सकता है । यह दृष्टिकोण उस से बचाता है। (बेशक, इसे से बाहर एक dict बनाने अभी भी कुछ रैम ले सकता है, लेकिन यह मूल फ़ाइल की तुलना में छोटे होने की गारंटी है।)

my_dict = {} 
for i, line in enumerate(file): 
    if (i - 8) % 7: 
     continue 
    k, v = line.split("\t")[:3:2] 
    my_dict[k] = v 

संपादित करें: सुनिश्चित नहीं हैं कि मैं कहाँ से पहले से extend मिला है। मेरा मतलब था update

+0

उत्तर के लिए धन्यवाद। मैंने उपरोक्त को कार्यान्वित करने का प्रयास किया है और अंतिम पंक्ति पर "ValueError" प्राप्त किया है - "शब्दकोश अद्यतन अनुक्रम तत्व # 0 की लंबाई 1 है; 2 आवश्यक है"। कोई सुझाव? – thefragileomen

+0

@thefragileomen एक और अधिक पठनीय दृष्टिकोण के लिए संपादित किया गया है जिसके लिए काम करने के लिए ब्रेसिज़ के तीन स्तरों की आवश्यकता नहीं है;) – kojiro

3

हालांकि अन्य समाधानों के साथ कुछ भी गलत नहीं है, लेकिन आप पाइथन के उत्कृष्ट पुस्तकालय पांडा का उपयोग कर अपने समाधान को सरल बना सकते हैं और बहुत बढ़ा सकते हैं।

पांडा अजगर में डेटा को संभालने के लिए एक पुस्तकालय, कई डाटा वैज्ञानिकों द्वारा पसंद किया है।

पांडा कि शब्दकोशों की एक सूची वापस जाने के लिए, प्रत्येक फ़ाइल की एक पंक्ति से युक्त किया जा सकता है और पढ़ने के लिए फ़ाइलों को पार्स करने के लिए एक सरल सीएसवी इंटरफेस, है। चाबियाँ कॉलम नाम होंगी, और मान प्रत्येक सेल में होंगे।

आपके मामले में:

import pandas 

    def create_dictionary(filename): 
     my_data = pandas.DataFrame.from_csv(filename, sep='\t', index_col=False) 
     # Here you can delete the dataframe collumns you dont want! 
     del my_data['B'] 
     del my_data['D'] 
     # ... 
     # Now you transform the DataFrame to a list of dictionaries 
     list_of_dicts = [item for item in my_data.T.to_dict().values()] 
     return list_of_dicts 

# Usage: 
x = create_dictionary("myfile.csv") 
संबंधित मुद्दे