2013-07-01 9 views
9

मैं अपने पाठ फ़ाइल की सामग्री के साथ एक शब्दकोश को भरने के लिए कोशिश कर रहा हूँ? खोल बहुत सारे मूल्यों के लिए (" out3.txt ")मैं ValueError कैसे तय कर सकते हैं: "पायथन में

मेरे पाठ फ़ाइल की है। प्रपत्र:

vs,14100 

mln,11491 

the,7973 

cts,7757 

... और इतने पर ...

मैं चाहता हूँ मेरी शब्दकोश answer इस रूप में होने के लिए:

answer[vs]=14100 

answer[mln]=11491 

... और इतने पर ...

मेरे कोड है:

import os 
import collections 
import re 
from collections import defaultdict 

answer = {} 
answer=collections.defaultdict(list) 
with open('out3.txt', 'r+') as istream: 
    for line in istream.readlines(): 
     k,v = line.strip().split(',') 
     answer[k.strip()].append(v.strip()) 

लेकिन, मुझे मिलती है:

ValueError: too many values to unpack

मैं इसे कैसे ठीक कर सकते हैं?

+4

मुझे संदेह है कि इनपुट फ़ाइल में से एक पंक्ति में एक से अधिक कॉमा हैं। 'Grep',। *, 'Out3.txt' आज़माएं। –

उत्तर

10

आप अपने इनपुट फ़ाइल में खाली line रों है और मैं line रों कि आप हमारे साथ साझा नहीं किया है में से एक संदेह है कि यह में ऐसे अनेक अल्पविराम (होते हैं इसलिए " अनपॅक करने के लिए बहुत सारे मूल्य ")।

तुम इतनी तरह, इस के खिलाफ की रक्षा कर सकते हैं:

import collections 

answer = collections.defaultdict(list) 
with open('out3.txt', 'r+') as istream: 
    for line in istream: 
     line = line.strip() 
     try: 
      k, v = line.split(',', 1) 
      answer[k.strip()].append(v.strip()) 
     except ValueError: 
      print('Ignoring: malformed line: "{}"'.format(line)) 

print(answer) 

नोट:str.split() में 1 में उत्तीर्ण होकर, सब कुछ के बाद पहली अल्पविराम v को सौंपा जाएगा; यदि यह वांछित व्यवहार नहीं है और आप इन पंक्तियों को खारिज करना पसंद करेंगे, तो आप इस तर्क को हटा सकते हैं।

+0

अभी भी वही त्रुटि !! –

+0

आह हाँ। मैंने अपना जवाब अपडेट कर लिया है। – Johnsyweb

+0

धन्यवाद! यह काम किया !! –

2

आपकी टेक्स्ट फ़ाइल में खाली लाइनें हैं, जिन्हें विभाजित नहीं किया जा सकता है। आप अगर लाइन में खाली है पता लगाने के लिए की जरूरत है:

for line in istream: 
    line = line.strip() 
    if line: 
     k,v = line.split(',') 
     answer[k.strip()].append(v.strip()) 
+1

मुझे अभी भी वही त्रुटि मिलती है! –

3

आपका समाधान आपके वांछित आउटपुट नहीं देता है। आप करेंगे (यह मानते हुए यह काम किया) है, answer['vs'] = [14100], नीचे आप क्या इरादा करता है:

import csv 

with open('out3.txt') as f: 
    reader = csv.reader(f, delimiter=',') 
    answer = {line[0].strip():line[1].strip() for line in reader if line} 
+1

+1 (जब तक कि इनपुट फ़ाइल बहुत विशिष्ट, सरल न हो)। – pepr

1

आप collections यहां जरूरत नहीं है। सादे पुराने dict पर्याप्त है:

answer = {} 
with open('out3.txt', 'r+') as f: 
    for line in f: 
     lst = line.split(',') 
     if len(lst) == 2: 
      k = lst[0].strip() 
      v = lst[1].strip() 
      answer[k] = v 

print(answer['mln']) 
print(answer.get('xxx', 'not available')) 

सूचना answer.get()answer[] के समान है लेकिन आप डिफ़ॉल्ट मूल्य की आपूर्ति कर सकते हैं।

आपको लूप में .readlines() का उपयोग नहीं करना चाहिए। यहां तक ​​कि खाली रेखा में न्यूलाइन चरित्र भी शामिल है। इस प्रकार परीक्षण if line: खाली लाइनों का पता नहीं लगाता है। या आपको पहले (या rstrip) स्ट्रिप करना होगा, या आप लाइन को सूची में विभाजित कर सकते हैं और तत्वों की संख्या का परीक्षण कर सकते हैं।

0

मुझे वही त्रुटि मिलती है जब मैंने django संस्करण 1.5 से 1.3 बदल दिया। उपयोगकर्ता ऑब्जेक्ट्स के अलग-अलग संस्करणों पर अलग-अलग मान थे। शायद यह वही स्थिति है। मैंने फ़ंक्शन में फिर से मान सेट किए हैं, और यह काम करता है।

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