ValueError: आधार के लिए अवैध शाब्दिक () आधार 10 के साथ: ''


333

मैं एक प्रोग्राम बना रहा हूं जो एक फाइल को पढ़ता है और अगर फाइल की पहली लाइन खाली नहीं है, तो यह अगली चार लाइनें पढ़ता है। गणना उन रेखाओं पर की जाती है और फिर अगली पंक्ति पढ़ी जाती है। यदि वह रेखा खाली नहीं है तो यह जारी रहती है। हालाँकि, मुझे यह त्रुटि मिल रही है:

ValueError: invalid literal for int() with base 10: ''.

यह पहली पंक्ति पढ़ रहा है, लेकिन इसे पूर्णांक में परिवर्तित नहीं कर सकता।

इस समस्या को सुलझाने में मैं क्या कर सकता हूं?

कोड:

file_to_read = raw_input("Enter file name of tests (empty string to end program):")
try:
    infile = open(file_to_read, 'r')
    while file_to_read != " ":
        file_to_write = raw_input("Enter output file name (.csv will be appended to it):")
        file_to_write = file_to_write + ".csv"
        outfile = open(file_to_write, "w")
        readings = (infile.readline())
        print readings
        while readings != 0:
            global count
            readings = int(readings)
            minimum = (infile.readline())
            maximum = (infile.readline())

3
आपको with open(file_to_read, 'r') as infile:वहां उपयोग करने पर विचार करना चाहिए ।
सर्वव्यापी

जवाबों:


310

सिर्फ रिकार्ड के लिए:

>>> int('55063.000000')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'

मुझे यहाँ मिल गया ...

>>> int(float('55063.000000'))
55063.0

उपयोग करना पड़ता है!


101
मैं सिर्फ भविष्य के पाठकों के लिए अधिक स्पष्टता प्रदान करने के लिए जोड़ूंगा, वास्तव में, int (फ्लोट ('1.0')) काम करता है जब int ('1.0') ValueError फेंकता है।
कतहफ

5
यह इस प्रश्न का स्वीकृत शीर्ष उत्तर होना चाहिए। मैंने पृष्ठ को लगभग बंद कर दिया और उसे नहीं देखा। धन्यवाद!
iTurki

2
उत्तर जोड़ने के लिए int (फ्लोट ('55063.000000')) प्रश्न int () है। यह वास्तव में शीर्ष उत्तर होगा
मैक्स

ऐसा क्यों होता है? @katyhuff
मुहम्मद हुसैनबाईस

7
यह उत्तर प्रश्न के साथ कुछ भी करने के लिए प्रकट नहीं होता है। सवाल पूछ रहा है कि जब आप int()खाली स्ट्रिंग पर कॉल करते हैं तो कोई वैल्यूएयर को कैसे रोक सकता है । "फ़्लोट का उपयोग करें () इसके बजाय" उस समस्या को हल नहीं करता है। आपको अभी भी एक ValueError मिलती है।
केविन

74

अजगर में निम्नलिखित पूरी तरह से स्वीकार्य हैं:

  • एक पूर्णांक के एक स्ट्रिंग प्रतिनिधित्व में गुजर रहा है int
  • में एक नाव का एक स्ट्रिंग प्रतिनिधित्व गुजर रहा है float
  • एक पूर्णांक के एक स्ट्रिंग प्रतिनिधित्व में गुजर रहा है float
  • एक नाव में गुजर रहा है int
  • में एक पूर्णांक गुजर रहा है float

लेकिन अगर आप एक प्राप्त ValueErrorकरता है, तो आप एक के एक स्ट्रिंग प्रतिनिधित्व पारित नाव में int, या कुछ भी की एक स्ट्रिंग प्रतिनिधित्व लेकिन (रिक्त स्ट्रिंग सहित) एक पूर्णांक। यदि आप किसी फ़्लोट के स्ट्रिंग प्रतिनिधित्व को पास नहीं करना चाहते हैं int, जैसा कि @katyhuff ऊपर बताता है, तो आप फ़्लोट में पहले कन्वर्ट कर सकते हैं, फिर एक पूर्णांक में:

>>> int('5')
5
>>> float('5.0')
5.0
>>> float('5')
5.0
>>> int(5.0)
5
>>> float(5)
5.0
>>> int('5.0')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5.0'
>>> int(float('5.0'))
5

7
यह उत्तर प्रश्न के साथ कुछ भी करने के लिए प्रकट नहीं होता है। सवाल पूछ रहा है कि जब आप int()खाली स्ट्रिंग पर कॉल करते हैं तो कोई वैल्यूएयर को कैसे रोक सकता है । "फ़्लोट का उपयोग करें () इसके बजाय" उस समस्या को हल नहीं करता है। आपको अभी भी एक ValueError मिलती है।
केविन

3
@ केविन भले ही यह सीधे ओपी के सवाल का जवाब नहीं देता है। हालांकि यह उन लोगों की मदद करता है जिनके पास यह समस्या है और इसे बुरा नहीं मानते int(float(x))। इस त्रुटि के लिए खोज करते समय यह पहला सवाल है।
केर्विन स्नेजर्स

57

एक फ़ाइल पर पुनरावृत्ति और int में परिवर्तित करने का पायथनिक तरीका:

for line in open(fname):
   if line.strip():           # line contains eol character(s)
       n = int(line)          # assuming single integer on each line

आप जो करने की कोशिश कर रहे हैं वह थोड़ा अधिक जटिल है, लेकिन फिर भी सीधे-आगे नहीं:

h = open(fname)
for line in h:
    if line.strip():
        [int(next(h).strip()) for _ in range(4)]     # list of integers

इस तरह यह समय पर 5 लाइनों को संसाधित करता है। पहले के h.next()बजाय next(h)पायथन 2.6 का उपयोग करें ।

आपके पास कारण यह ValueErrorहै कि intखाली स्ट्रिंग को पूर्णांक में परिवर्तित नहीं किया जा सकता है। इस स्थिति में आपको या तो रूपांतरण से पहले स्ट्रिंग की सामग्री की जाँच करनी होगी, या एक त्रुटि को छोड़कर:

try:
   int('')
except ValueError:
   pass      # or whatever

4
आपकी कोशिश / छोड़कर कुछ उचित उम्मीद के बीच अंतर नहीं है (खाली / खाली लाइन) और एक गैर पूर्णांक की तरह कुछ बुरा।
जॉन मैकिन

और आप उन चीजों को अलग क्यों करना चाहेंगे?
साइलेंटगॉस्ट

3
क्योंकि एक बहुत ही उम्मीद और इग्नोर करने वाला है लेकिन दूसरा एक त्रुटि का संकेत है
जॉन मैकिन

3
और क्यों एक रिक्त रेखा यथोचित अपेक्षित है और गैर पूर्णांक नहीं है?
साइलेंटगॉस्ट

1
यह अच्छा है यदि आप सुनिश्चित हैं कि आपकी सूची वास्तव में कड़े पूर्णांकों की सूची है। यदि आप सुनिश्चित नहीं हैं कि आप कर सकते हैंn = int(line) if line.is_integer() else int(float(line))
माइक फुरलेंडर

23

मुझे चारों ओर एक काम मिला। पायथन संख्या को फ्लोट में बदल देगा। बस फ्लोट को पहले कॉल करना और फिर उसे एक इंट में बदलना काम करेगा: output = int(float(input))


11

कारण यह है कि आपको एक रिक्त स्ट्रिंग या एक स्ट्रिंग मिल रही है तर्क में int। जांचें कि क्या यह खाली है या इसमें अल्फा वर्ण हैं। यदि इसमें वर्ण हैं, तो बस उस भाग को अनदेखा करें।


2
यह एक टिप्पणी की तरह लग रहा है। जब आपके पास पर्याप्त प्रतिष्ठा होगी तो आप किसी भी पोस्ट पर टिप्पणी कर पाएंगे।
जोशुआ ड्रेक

8

आपके द्वारा यह त्रुटि प्राप्त करने का कारण यह है कि आप अंतरिक्ष वर्ण को पूर्णांक में बदलने का प्रयास कर रहे हैं, जो पूरी तरह से असंभव और प्रतिबंधित है। और यही कारण है कि आपको यह त्रुटि मिल रही है।यहां छवि विवरण दर्ज करें

अपना कोड जांचें और इसे ठीक करें, यह ठीक काम करेगा


8

तो अगर आपके पास है

floatInString = '5.0'

आप इसे करने के लिए परिवर्तित कर सकते हैं intसाथfloatInInt = int(float(floatInString))


3

आपको इस लाइन से समस्या हुई है:

while file_to_read != " ":

इससे खाली स्ट्रिंग नहीं मिलती है। यह एक स्ट्रिंग को एक स्थान से युक्त पाता है। संभवत: यह वह नहीं है जिसकी आपको तलाश है।

बाकी सबकी सलाह सुनो। यह बहुत मुहावरेदार पायथन कोड नहीं है, और यदि आप सीधे फ़ाइल पर पुनरावृति करते हैं तो यह बहुत स्पष्ट होगा, लेकिन मुझे लगता है कि यह समस्या ध्यान देने योग्य है।


3

कृपया इस फ़ंक्शन ( split()) को एक साधारण फ़ाइल पर परीक्षण करें । मैं एक ही मुद्दे का सामना कर रहा था और पाया कि यह split()ठीक से लिखा नहीं गया था (अपवाद हैंडलिंग)।


1
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

उस कोड के साथ एक समस्या है। readingsफ़ाइल से पढ़ी गई एक नई पंक्ति है - यह एक स्ट्रिंग है। इसलिए आपको इसकी तुलना 0. नहीं करनी चाहिए। इसके अलावा, आप इसे केवल एक पूर्णांक में परिवर्तित नहीं कर सकते, जब तक कि आपको यकीन न हो कि यह वास्तव में एक है। उदाहरण के लिए, खाली लाइनें यहां त्रुटियां उत्पन्न करेंगी (जैसा कि आपको निश्चित रूप से पता चला है)।

और आपको वैश्विक गणना की आवश्यकता क्यों है? यह पायथन में सबसे निश्चित रूप से खराब डिजाइन है।


1

यह तब भी हो सकता है जब आपको किसी सूची में स्पेस अलग किए गए पूर्णांकों को मैप करना होता है, लेकिन आप पूर्णांक रेखा का उपयोग करके लाइन में प्रवेश करते हैं .input()। उदाहरण के लिए जैसे मैं HackerRank बोन- एपेटिट पर इस समस्या को हल कर रहा था , और संकलन करते समय निम्नलिखित त्रुटि हुई यहां छवि विवरण दर्ज करें

इसलिए लाइन द्वारा प्रोग्राम लाइन पर इनपुट देने के बजाय, map()विधि का उपयोग करके सूची में अलग किए गए पूर्णांकों को अंतरिक्ष में मैप करने का प्रयास करें ।


0

मैं एक प्रोग्राम बना रहा हूं जो एक फाइल को पढ़ता है और अगर फाइल की पहली लाइन खाली नहीं है, तो यह अगली चार लाइनें पढ़ता है। गणना उन रेखाओं पर की जाती है और फिर अगली पंक्ति पढ़ी जाती है।

कुछ इस तरह काम करना चाहिए:

for line in infile:
    next_lines = []
    if line.strip():
        for i in xrange(4):
            try:
                next_lines.append(infile.next())
            except StopIteration:
                break
    # Do your calculation with "4 lines" here

0

मुझे इसी तरह की त्रुटियां हो रही थीं, पता चला कि डेटासेट में रिक्त मान थे जो अजगर पूर्णांक में परिवर्तित नहीं हो सकते थे।


4
क्या आप कुछ उदाहरणों के साथ थोड़ा और विस्तृत कर सकते हैं कि ओपी इसे कैसे हल कर सकता है?
fmendez

रिक्त मान का अर्थ है खाली जो स्ट्रिंग फ्लोट में परिवर्तित किया जा सकता है। यदि आप फ्लोट में बदलने की कोशिश करते हैं, तो यह त्रुटि दिखाएगी
सरवनन सिनमैथन

0

एक ही फ़ाइल ऑब्जेक्ट के लिए लूप के अंदर रीडलाइन () का उपयोग करने का प्रयास करते समय मैं एक ही मुद्दे में आ गया ... मेरा संदेह रीडलाइन () के अंदर रीडिंग निकाल रहा है (उसी फ़ाइल ऑब्जेक्ट के लिए यह त्रुटि हुई।

सर्वश्रेष्ठ समाधान का उपयोग किया जा सकता है (0) फ़ाइल पॉइंटर को रीसेट करने के लिए या कुछ ध्वज सेट करने के साथ हैंडल की स्थिति को फिर से स्थिति की जाँच करके उसी फ़ाइल के लिए नई ऑब्जेक्ट बनाएं ...।


0

मैं हाल ही में एक ऐसे मामले में सामने आया जहां इनमें से किसी भी जवाब ने काम नहीं किया। मुझे CSV डेटा का सामना करना पड़ा जहाँ डेटा के साथ मिश्रित बाइट्स थे, और उन नल बाइट्स को छीन नहीं पाया। तो, मेरी सांख्यिक स्ट्रिंग, अलग करने के बाद, इस तरह बाइट्स से मिलकर:

\x00\x31\x00\x0d\x00

इसका मुकाबला करने के लिए, मैंने किया:

countStr = fields[3].replace('\x00', '').strip()
count = int(countStr)

... जहां फ़ील्ड लाइन को विभाजित करने के परिणामस्वरूप सीएसवी मानों की एक सूची है।


0

ऐसा लगता है कि रीडिंग कभी-कभी एक खाली स्ट्रिंग होती है और स्पष्ट रूप से एक त्रुटि फसल होती है। आप इंट (रीडिंग) कमांड से पहले अपने लूप में अतिरिक्त चेक जोड़ सकते हैं जैसे:

while readings != 0 | readings != '':
    global count
    readings = int(readings)

0

मेरे पास वास्तविक कारण जानने में मुश्किल समय था, यह तब होता है जब हम फ़ाइल से ठीक से नहीं पढ़ते हैं। आपको फ़ाइल खोलने और रीडलाइन () विधि के साथ नीचे पढ़ने की आवश्यकता है:

with open('/content/drive/pre-processed-users1.1.tsv') as f:
    file=f.readlines()

यह स्वरूपित आउटपुट को सही करता है


0

इस पंक्ति के कारण आपके उत्तर में त्रुटियां हैं

readings = int(readings)
  1. यहां आप एक स्ट्रिंग को इंट प्रकार में बदलने की कोशिश कर रहे हैं जो कि बेस -10 नहीं है। आप एक स्ट्रिंग को इंट में तभी बदल सकते हैं जब वह बेस -10 हो अन्यथा यह बेस 10 के साथ वैल्यू फॉर इंटेरल () के लिए वैल्यूएयर को फेंक देगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.