2011-12-17 8 views
5

से फ्लोट प्राप्त करना मैं xlrd का उपयोग कर एक्सेल फ़ाइल से मूल्यों को पढ़ने का प्रयास कर रहा हूं। यह तारीखों, संख्याओं, और अब तक पाठ पर बहुत अच्छा काम कर रहा है। मेरे पास एक स्तंभ (श्रेणी) है जिसमें टेक्स्ट युक्त कक्ष हैं (कोशिकाओं को पाठ के रूप में स्वरूपित किया गया है)। जब मैं सेल मान मुद्रित करता हूं तो पाठ के बजाए एक फ्लोट प्रदर्शित होता है। मैंने सेल ऑब्जेक्ट के प्रकार को जांचने के लिए भी मुद्रित किया और यह संख्या के रूप में दिखा रहा है। मैंने xlrd के प्रलेखन और ट्यूटोरियल के माध्यम से पढ़ा है और यह प्रतीत नहीं होता है कि यह क्यों हो रहा है। क्या यह हो सकता है कि मेरी एक्सेल फ़ाइल किसी तरह से गड़बड़ हो गई हो? सही दिशा में कोई सुझाव या पॉइंटर्स?पायथन xlrd एक्सेल टेक्स्ट सेल

import xlrd 
import datetime 

workbook = xlrd.open_workbook('training.xls') 
courseSheet = workbook.sheet_by_index(0) 

for row in range(courseSheet.nrows): 
    title = courseSheet.cell_value(row, 2) 
    date = courseSheet.cell_value(row, 4) 
    date = datetime.datetime(*xlrd.xldate_as_tuple(date, workbook.datemode)) 
    dateTuple = date.timetuple() 
    category = courseSheet.cell_value(row, 7) 
    print category 
+0

कॉलम 7 में कक्षों का 'cell.ctype' क्या है? –

+0

आपकी समस्या को समझने के लिए मैंने आपके पोस्ट कोड को कैसे पढ़ा जाना चाहिए? आप कैसे जानते हैं कि यह एक फ्लोट है? 'प्रिंट श्रेणी 'प्रिंटआउट से? – joaquin

+0

@ माइकपेनिंगटन कॉलम 7 में सेल्स के प्रकार का प्रकार xlrd.XL_CELL_NUMBER है। मुझे यकीन नहीं है कि xlrd एक टेक्स्ट सेल क्यों पढ़ रहा है। – binaryFever

उत्तर

3

पृष्ठभूमि: प्रत्येक कक्ष के लिए, xlrd आंतरिक मूल्य रिपोर्ट (यदि हो तो) कि XLS फ़ाइल में संग्रहित है। मान प्रकार को फ़ाइल में रिकॉर्ड प्रकार के आधार पर प्रारंभ में ही असाइन किया जाता है (उदा। NUMBER और आरके रिकॉर्ड में फ़्लोटिंग-पॉइंट नंबर होते हैं)। यह here वर्णित स्वरूपों को वर्गीकृत करता है और उस जानकारी का उपयोग मूल्य प्रकार को ओवरराइड करने के लिए करता है जहां यह स्पष्ट होता है कि डेटाटाइम, दिनांक या समय का उद्देश्य एक संख्या है। xlrd सेल मान के प्रारूप के अनुसार सेल मानों को प्रस्तुत करने में सक्षम होने के लिए purport नहीं करता है।

प्रश्न में कोशिकाओं को स्पष्ट रूप से संख्याओं के रूप में दर्ज किया गया है। अगर उनके पास एक टेक्स्ट प्रारूप लागू होता है, जो उन्हें "टेक्स्ट सेल" नहीं बनाता है।

आप कहते हैं "" जब मैं सेल मान मुद्रित करता हूं तो पाठ के बजाय फ्लोट प्रदर्शित होता है ... "कृपया फ़ाइल के निर्माण के दौरान सेल में टाइप किए गए कुछ उदाहरण दें (ए) बी) सबूत क्या हैं कि "कोशिकाओं को पाठ के रूप में स्वरूपित किया जाता है" (सी) repr (cell.value) क्या है (डी) "पाठ" क्या है जिसे आप प्रदर्शित करने की उम्मीद करते हैं?

आप नीचे दिए गए कोड उपयोगी हो सकते हैं:

import xlrd, sys 

def dump_cell(sheet, rowx, colx): 
    c = sheet.cell(rowx, colx) 
    xf = sheet.book.xf_list[c.xf_index] 
    fmt_obj = sheet.book.format_map[xf.format_key] 
    print rowx, colx, repr(c.value), c.ctype, \ 
     fmt_obj.type, fmt_obj.format_key, fmt_obj.format_str 

book = xlrd.open_workbook(sys.argv[1], formatting_info=1) 
sheet = book.sheet_by_index(0) 
for rowx in xrange(sheet.nrows): 
    for colx in xrange(sheet.ncols): 
     dump_cell(sheet, rowx, colx) 
+0

'कच्चे' सेल मूल्य को पढ़ने और उसके साथ काम करने का कोई तरीका? –

0

मैं ओ पी के रूप में ही समस्या है और मुझे लगता है कि मैं इस निष्कर्ष पर ऐसे मामले भी हैं कि जहां अजगर पर कोई समाधान नहीं है (xlrd पर आए हैं) पक्ष। आप इस बात पर दया कर रहे हैं कि मूल रूप से एक्सेल शीट में डेटा कैसे दर्ज किया गया था। विशेष रूप से, यदि डेटा उस सेल में दर्ज किया गया था जिसमें पहले से ही सही 'टेक्स्ट' प्रारूप लागू होता है, या यदि डेटा को 'सामान्य' प्रारूप वाले सेल में दर्ज किया गया था और फिर सेल का प्रारूप बदल दिया गया था ' डेटा दर्ज करने के बाद 'टेक्स्ट' दर्ज किया गया था।

यदि आप प्री-फॉर्मेटेड सेल में डेटा दर्ज करते हैं, तो आपके न्यूमेरिक डेटा को एक्सेल चेतावनी टिक के साथ फ़्लैग किया जाएगा जो दर्शाता है कि आपके पास पाठ के लिए स्वरूपित सेल में संख्यात्मक डेटा है। इस मामले में, xlrd डेटा को संभाल लेगा जैसा आप उम्मीद कर रहे हैं - स्ट्रिंग को वापस करने के रूप में यह एक्सेल वर्कशीट में दिखाई देता है। (उदाहरण के लिए एक्सेल और एक्सएलआरडी में "1" के रूप में पढ़ने वाली सेल सामग्री सेल मान के रूप में "1" लौटाएगी)

हालांकि, यदि आप संख्यात्मक डेटा दर्ज किए जाने के बाद सेल के प्रारूप को बदलते हैं तो आप समाप्त हो जाएंगे ऐसी स्थिति में जहां एक्सेल में डेटा "1" के रूप में प्रस्तुत किया जाता है, लेकिन xlrd "1.0" का सेल मान वापस कर देगा। यदि आप इस सेल के लिए xlrd cell.ctype की जांच करते हैं तो आप देखेंगे कि सेल को अभी भी एक संख्या के रूप में माना जा रहा है, भले ही प्रारूप Excel में टेक्स्ट में बदल दिया गया हो।

आपके एक्सेल स्ट्रिंग डेटा को उद्धरणों से घिरा हुआ एक संभावित समाधान हो सकता है। यह डेटा को शुरुआत से एक संख्यात्मक मूल्य के रूप में इलाज से एक्सेल को प्रतिबंधित करेगा।

+0

जो जॉन माचिन अपने जवाब में व्याख्या करने की कोशिश कर रहा था वह यह है कि एक्सेल का "टेक्स्ट प्रारूप" केवल स्वरूपण कर रहा है। यह डेटा के अंतर्निहित प्रकार को नहीं बदलता है। यदि एक्सेल मानता है कि डेटा संख्यात्मक है, तो इसे एक फ्लोट के रूप में संग्रहीत किया जाता है। अवधि। कहानी का अंत। आप यह भी देख सकते हैं कि यह ** नहीं ** टेक्स्ट के रूप में माना जाता है (Excel द्वारा प्रस्तुत किसी भी शब्दकोष के बावजूद) जब आप उस सेल को संख्यात्मक सूत्र में शामिल करते हैं, जैसे 'SUM'। यदि आप एक सेल बनाते हैं जिसका अंतर्निहित प्रकार टेक्स्ट है, जैसे एक एस्ट्रोफ़े में प्रवेश करके, संख्या के बाद, वह सेल 'SUM' में कुछ भी योगदान नहीं देगा। –

+0

जॉन वाई - मैं समझता हूं कि आप क्या कह रहे हैं। मेरी पोस्ट "अगर एक्सेल मानती है कि डेटा संख्यात्मक है" समस्या का हिस्सा है क्योंकि मुझे लगता है कि भ्रम कहाँ से आ रहा है। विशेष रूप से तथ्य यह है कि जिस क्रम में सेल के प्रारूप को सेट करना और सेल के डेटा में प्रवेश करना उस पर प्रभाव डालता है कि Excel का मानना ​​है कि डेटा का एक टुकड़ा संख्यात्मक है या पाठ –

+0

क्षमा करें, यह अब तक मुझे पूरी तरह से समझने के लिए ले गया है कि क्या व्यक्त किया जा रहा था यह जवाब यह वास्तव में मुझे समझ में नहीं आया था कि "सामान टाइप करें, फिर फॉर्मेटिंग सेट करें" संभवतः "सेट फॉर्मेटिंग सेट करें, फिर सामान टाइप करें" से अलग कुछ हो सकता है। और फिर भी यह वास्तव में करता है। Xlrd भंडार में [मुद्दा 140] (https://github.com/python-excel/xlrd/issues/140) का जवाब देने के कुछ समय बाद हल्का बल्ब आया था। –