2012-11-22 19 views
6

मुझे टेक्स्ट फ़ाइल की पंक्तियों से डेटा निकालने की आवश्यकता है।टेक्स्ट फ़ाइल की पंक्तियों से डेटा निकालें

Shyvana - 12/4/5 - Loss - 2012-11-22 
Fizz - 12/4/5 - Win - 2012-11-22 
Miss Fortune - 12/4/3 - Win - 2012-11-22 

इस फ़ाइल में मेरी छोटी अजगर कार्यक्रम के दूसरे भाग है, जहां मैं नाम के लिए उपयोगकर्ता पूछने से उत्पन्न होता है, नाम वे प्रवेश देखने में यह एक से मान्य है सुनिश्चित करने के लिए: डेटा नाम और जानकारी स्कोरिंग इस प्रकार फ़ॉर्मेट है नामों की सूची, और फिर हत्या, मौत, सहायता, और चाहे वे जीते या हार गए हों। फिर मैं पुष्टि के लिए पूछता हूं और उस डेटा को एक नई लाइन पर फ़ाइल में लिखता हूं, और इस तरह की तारीख को अंत में जोड़ता हूं। कोड है कि उस डेटा तैयार करता है:

data = "%s - %s/%s/%s - %s - %s\n" % (
     champname, kills, deaths, assists, winloss, timestamp) 

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

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

+0

आप इसे पढ़ते हैं पीछे, आप किस डेटा संरचना को स्टोर करना चाहते हैं? – inspectorG4dget

+0

ओह अच्छाई आप सबको बहुत धन्यवाद, आखिर में इस विभाजन के कुछ समझ में आता है! मैं इनमें से कुछ को आज़मा दूंगा और देख सकता हूं कि मेरे लिए सबसे अच्छा क्या काम करता है, धन्यवाद! और धन्यवाद धन्यवाद! – Kassandra

उत्तर

10

निम्नलिखित सबकुछ खिलाड़ी नाम से कुंजीपटल में पढ़ा जाएगा। प्रत्येक खिलाड़ी के साथ जुड़ा हुआ मूल्य स्वयं एक शब्दकोश है जो आगे के प्रसंस्करण के लिए उपयुक्त प्रारूप में परिवर्तित वस्तुओं के साथ नामित फ़ील्ड के साथ रिकॉर्ड के रूप में कार्य करता है।

info = {} 
with open('scoring_info.txt') as input_file: 
    for line in input_file: 
     player, stats, outcome, date = (
      item.strip() for item in line.split('-', 3)) 
     stats = dict(zip(('kills', 'deaths', 'assists'), 
          map(int, stats.split('/')))) 
     date = tuple(map(int, date.split('-'))) 
     info[player] = dict(zip(('stats', 'outcome', 'date'), 
           (stats, outcome, date))) 

print('info:') 
for player, record in info.items(): 
    print(' player %r:' % player) 
    for field, value in record.items(): 
     print(' %s: %s' % (field, value)) 

# sample usage 
player = 'Fizz' 
print('\n%s had %s kills in the game' % (player, info[player]['stats']['kills'])) 

आउटपुट:

info: 
    player 'Shyvana': 
    date: (2012, 11, 22) 
    outcome: Loss 
    stats: {'assists': 5, 'kills': 12, 'deaths': 4} 
    player 'Miss Fortune': 
    date: (2012, 11, 22) 
    outcome: Win 
    stats: {'assists': 3, 'kills': 12, 'deaths': 4} 
    player 'Fizz': 
    date: (2012, 11, 22) 
    outcome: Win 
    stats: {'assists': 5, 'kills': 12, 'deaths': 4} 

Fizz had 12 kills in the game 

वैकल्पिक रूप से, बल्कि शब्दकोशों में डेटा है, जो नेस्टेड मैदान पहुँच थोड़ा अजीब कर सकते हैं का सबसे पकड़ से - info[player]['stats']['kills'] - आप के बजाय एक छोटे से अधिक उन्नत इस्तेमाल कर सकते हैं " सामान्य "वर्ग उन्हें पकड़ने के लिए, जो आपको इसके बजाय info2[player].stats.kills लिखने देगा।

समझाने के लिए, यहाँ लगभग एक ही बात एक वर्ग मैं Struct नाम दिया है यह सी भाषा का struct डेटा प्रकार की तरह कुछ हद तक है, क्योंकि का उपयोग कर रहा है:

class Struct(object): 
    """ Generic container object """ 
    def __init__(self, **kwds): # keyword args define attribute names and values 
     self.__dict__.update(**kwds) 

info2 = {} 
with open('scoring_info.txt') as input_file: 
    for line in input_file: 
     player, stats, outcome, date = (
      item.strip() for item in line.split('-', 3)) 
     stats = dict(zip(('kills', 'deaths', 'assists'), 
          map(int, stats.split('/')))) 
     victory = (outcome.lower() == 'win') # change to boolean T/F 
     date = dict(zip(('year','month','day'), map(int, date.split('-')))) 
     info2[player] = Struct(champ_name=player, stats=Struct(**stats), 
           victory=victory, date=Struct(**date)) 
print('info2:') 
for rec in info2.values(): 
    print(' player %r:' % rec.champ_name) 
    print(' stats: kills=%s, deaths=%s, assists=%s' % (
      rec.stats.kills, rec.stats.deaths, rec.stats.assists)) 
    print(' victorious: %s' % rec.victory) 
    print(' date: %d-%02d-%02d' % (rec.date.year, rec.date.month, rec.date.day)) 

# sample usage 
player = 'Fizz' 
print('\n%s had %s kills in the game' % (player, info2[player].stats.kills)) 

आउटपुट:

info2: 
    player 'Shyvana': 
    stats: kills=12, deaths=4, assists=5 
    victorious: False 
    date: 2012-11-22 
    player 'Miss Fortune': 
    stats: kills=12, deaths=4, assists=3 
    victorious: True 
    date: 2012-11-22 
    player 'Fizz': 
    stats: kills=12, deaths=4, assists=5 
    victorious: True 
    date: 2012-11-22 

Fizz had 12 kills in the game 
+0

ऐसा लगता है कि यह मेरी फाइल पर काम कर रहा है, मैं एक खिलाड़ी के लिए एक विशिष्ट स्टेटस कैसे प्राप्त कर सकता हूं? मेरी ट्यूटोरियल पुस्तक जो मैं कर रहा हूं वह शब्दकोश वाक्यविन्यास में बहुत गहरी नहीं जाती है, उदाहरण के लिए मैं "फ़िज़ था" प्रिंट कैसे कर सकता हूं, "गेम में" मारता है। – Kassandra

+0

@ कसंद्रा: वह 'प्रिंट' होगा 'फिज' की%% ['फिज'] ['आँकड़े'] ['हत्या'] में% s की मौत हो गई थी। आपके डेटा को संरचित करने के अन्य तरीके हैं, उदाहरण के लिए एक या अधिक कस्टम कक्षाओं का उपयोग करके या शायद 'संग्रह' मॉड्यूल में 'नामितूपल्स' जैसी बिल्ट-इन क्लास का उपयोग करके। वे आपको 'जानकारी [' Fizz '] लिखने देंगे। Figures.kills'। – martineau

+0

ओह गोश जो अच्छा लगता है, मैं यहां थोड़ा सा प्रयास करूंगा और देख सकता हूं कि मैं जो चाहता हूं उसे प्राप्त कर सकता हूं, मुझे नहीं पता था कि मैं ऐसा कर सकता हूं जैसे कि मैं एक नया नया फ़ंक्शन सेटअप अनुकूलित करने की कोशिश कर रहा हूं मेरी फाइल को संभालने के लिए, जब मैं बस कुछ वर्र्स सेट कर सकता था, बीमार यह कोशिश करता है, नामित पर नोटेशन अच्छा दिखता है मैं भी कोशिश करता हूं, फिर से धन्यवाद! – Kassandra

3

आपके टेक्स्टफाइल उदाहरण से डेटा को पढ़ने के दो तरीके हैं।

सबसे पहले विधि

आप अजगर के सीएसवी मॉड्यूल का उपयोग और निर्दिष्ट करें कि आपके सीमांकक - है सकते हैं।

वैकल्पिक रूप से http://www.doughellmann.com/PyMOTW/csv/

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

f = open('myTextFile.txt', "r") 
lines = f.readlines() 

for line in lines: 
    words = line.split("-") # words is a list (of strings from a line), delimited by "-". 
ऊपर अपने उदाहरण में

तो, champname वास्तव में words सूची है, जो words[0] है में पहला आइटम हो जाएगा।

+0

पहले टाइपिंग खत्म नहीं किया था। –

3

आप विभाजन ('-') का उपयोग करना चाहते भागों, तो शायद फिर से पाने के लिए नंबर प्राप्त करने:

for line in yourfile.readlines(): 
    data = line.split (' - ') 
    nums = [int (x) for x in data[1].split ('/')] 

आप सब सामान आप डेटा में आवश्यकता हो जाना चाहिए [] और nums [] । वैकल्पिक रूप से, आप पुनः मॉड्यूल का उपयोग कर सकते हैं और इसके लिए एक नियमित अभिव्यक्ति लिख सकते हैं। हालांकि, इसके लिए पर्याप्त जटिल प्रतीत नहीं होता है।

1

सबसे पहले, आप लाइन डेटा टुकड़ों में

>>> name, score, result, date = "Fizz - 12/4/5 - Win - 2012-11-22".split(' - ') 
>>> name 
'Fizz' 
>>> score 
'12/4/5' 
>>> result 
'Win' 
>>> date 
'2012-11-22' 

दूसरा अपने स्कोर को तोड़ने, पार्स

>>> k,d,a = map(int, score.split('/')) 
>>> k,d,a 
(12, 4, 5) 

और अंत में, तारीख वस्तु में दिनांक स्ट्रिंग परिवर्तित

>>> from datetime import datetime  
>>> datetime.strptime(date, '%Y-%M-%d').date() 
datetime.date(2012, 1, 22) 

अब आपके पास आपके सभी हिस्सों को डेटा प्रकारों के लिए पार्स और सामान्यीकृत किया गया है।

3
# Iterates over the lines in the file. 
for line in open('data_file.txt'): 
    # Splits the line in four elements separated by dashes. Each element is then 
    # unpacked to the correct variable name. 
    champname, score, winloss, timestamp = line.split(' - ') 

    # Since 'score' holds the string with the three values joined, 
    # we need to split them again, this time using a slash as separator. 
    # This results in a list of strings, so we apply the 'int' function 
    # to each of them to convert to integer. This list of integers is 
    # then unpacked into the kills, deaths and assists variables 
    kills, deaths, assists = map(int, score.split('/')) 

    # Now you are you free to use the variables read to whatever you want. Since 
    # kills, deaths and assists are integers, you can sum, multiply and add 
    # them easily. 
+0

मैं इसे आज़मा रहा हूं लेकिन मुझे लगता है कि मैं इसका उपयोग नहीं कर रहा हूं, मैं 'info = "मिस फॉर्च्यून करने की कोशिश कर रहा हूं - 12/4/3 - विन - 2012-11-22" जानकारी में आइटम के लिए : \t चैंपनाम, स्कोर, winloss, timestamp = item.split ("-") प्रिंट चैंपनाम ' – Kassandra

+0

यदि आप एक पंक्ति के साथ परीक्षण करना चाहते हैं, तो "मिस फॉर्च्यून - 12/4/3 में लाइन के लिए' का उपयोग करें - विन - 2012-11-22 "]:', एक सूची में और कच्ची स्ट्रिंग नहीं। अन्यथा यह अलग-अलग पात्रों को पढ़ेगा और उनसे जानकारी निकालने का प्रयास करेगा। – BoppreH

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