মান 10: '' বেস সহ int () এর জন্য অবৈধ আক্ষরিক


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
আমি কেবল যুক্ত করব, ভবিষ্যতের পাঠকদের জন্য আরও স্পষ্টতা সরবরাহ করার জন্য, যখন প্রকৃতপক্ষে ('১.০') ভ্যালুআরকে নিক্ষেপ করবে তখন ইনট (ফ্লোট ('০.০')) কাজ করে।
কাতিহুফ

5
এটি এই প্রশ্নের গৃহীত শীর্ষ উত্তর হওয়া উচিত। আমি পৃষ্ঠাটি প্রায় বন্ধ করে দিয়েছি এবং এটি দেখিনি। ধন্যবাদ!
আইটুরকি

2
প্রশ্নটি ইন্ট্রি () পেয়ে যাওয়ায় উত্তরের (ফ্লোট ('55063.000000')) যুক্ত করুন। এর চেয়ে সত্যই শীর্ষ উত্তরটি দেবে
ম্যাক্স

কেন এমন হয়? @ কেটিহুফ
মুহাম্মদ হুসেনবাজি

7
এই উত্তরটির সাথে প্রশ্নের কিছু করার নেই বলে মনে হচ্ছে। প্রশ্নটি জিজ্ঞাসা করছে যে আপনি যখন int()কোনও খালি স্ট্রিংয়ের উপর কল করেন তখন কীভাবে কেউ একটি ValueError প্রতিরোধ করতে পারে । "পরিবর্তে ভাসা () ব্যবহার করুন" সমস্যাটি সমাধান করে না। আপনি এখনও একটি ভ্যালুএরর পাবেন।
কেভিন

74

নিম্নলিখিত অজগর সম্পূর্ণ গ্রহণযোগ্য:

  • একটি পূর্ণসংখ্যার একটি স্ট্রিং প্রতিনিধিত্ব মধ্যে পাস int
  • মধ্যে একটি ভাসমান একটি স্ট্রিং প্রতিনিধিত্ব পাস float
  • একটি পূর্ণসংখ্যার একটি স্ট্রিং প্রতিনিধিত্ব মধ্যে পাস float
  • মধ্যে একটি ভাসা পাস int
  • মধ্যে একটি পূর্ণসংখ্যা পাস float

তবে আপনি যদি পেতে ValueErrorআপনি একটি একটি স্ট্রিং উপস্থাপনা পাস ভাসা মধ্যে int, বা কিছু একটি স্ট্রিং উপস্থাপনা কিন্তু (খালি স্ট্রিং সহ) একটি পূর্ণসংখ্যা। intউপরের কথা যেমন @ ক্যাটহিফ উল্লেখ করেছেন, আপনি যদি একটি ফ্লোটের স্ট্রিং প্রতিনিধিত্ব করতে চান তবে আপনি প্রথমে একটি ফ্লোটে রূপান্তর করতে পারেন, তারপরে একটি পূর্ণসংখ্যায়:

>>> 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

পাইথোনিক কোনও ফাইলের মাধ্যমে পুনরাবৃত্তি এবং ইনটিতে রূপান্তর করার উপায়:

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 টি লাইন প্রসেস করে। পাইথন ২.6 h.next()এর next(h)পূর্বে ব্যবহার করুন ।

আপনার কাছে থাকার কারণটি ValueErrorহ'ল intখালি স্ট্রিংটিকে পূর্ণসংখ্যায় রূপান্তর করতে পারে না। এই ক্ষেত্রে আপনাকে রূপান্তর করার আগে স্ট্রিংয়ের বিষয়বস্তু যাচাই করতে হবে, অথবা একটি ত্রুটি ব্যতীত:

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

4
আপনার চেষ্টা / ব্যতীত যুক্তিসঙ্গত প্রত্যাশিত (ফাঁকা / ফাঁকা লাইন) কিছু এবং কোনও অ-পূর্ণসংখ্যার মতো খারাপ কিছু something
জন মাচিন

এবং কেন আপনি এই জিনিসগুলি আলাদা করতে চান?
সাইলেন্টগোস্ট

3
কারণ একটি যুক্তিসঙ্গতভাবে প্রত্যাশিত এবং অজ্ঞান তবে অন্যটি একটি ত্রুটির নির্দেশক
জন মাচিন

3
এবং কেন একটি ফাঁকা রেখাটি যুক্তিসঙ্গতভাবে প্রত্যাশিত এবং অ-পূর্ণসংখ্যক নয়?
সাইলেন্টগোস্ট

1
এটি ভাল যদি আপনি নিশ্চিত হন যে আপনার তালিকাটি আসলে স্ট্রিংযুক্ত পূর্ণসংখ্যার একটি তালিকা। আপনি যদি নিশ্চিত না হন তবে আপনি এটি করতে পারেনn = int(line) if line.is_integer() else int(float(line))
মাইক ফারলেন্ডার

23

আশেপাশে একটা কাজ পেয়েছি। পাইথন সংখ্যাটিকে একটি ফ্লোটে রূপান্তর করবে। কেবল প্রথমে ফ্লোট কল করে প্রথমে এটিকে রূপান্তর করতে কাজ করবে: output = int(float(input))


11

কারণটি হ'ল আপনি খালি স্ট্রিং বা একটি স্ট্রিংটি যুক্তিরূপ হিসাবে অন্তর্ভুক্ত করছেন। এটি খালি আছে কিনা তা যাচাই করুন বা এতে আলফা অক্ষর রয়েছে। যদি এতে অক্ষর থাকে, তবে কেবল সেই অংশটি উপেক্ষা করুন।


2
এটি আরও একটি মন্তব্যের মতো দেখাচ্ছে। আপনার যথেষ্ট খ্যাতি থাকলে আপনি যে কোনও পোস্টে মন্তব্য করতে সক্ষম হবেন।
জোশুয়া ড্রাক

8

যে কারণে আপনি এই ত্রুটিটি পাচ্ছেন তা হ'ল আপনি কোনও স্থানের অক্ষরটিকে একটি পূর্ণসংখ্যার সাথে রূপান্তর করার চেষ্টা করছেন যা সম্পূর্ণ অসম্ভব এবং সীমাবদ্ধ nd এবং এই কারণেই আপনি এই ত্রুটিটি পাচ্ছেন।এখানে চিত্র বর্ণনা লিখুন

আপনার কোডটি যাচাই করুন এবং এটি সংশোধন করুন, এটি দুর্দান্ত কাজ করবে


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()। উদাহরণস্বরূপ আমি হ্যাকারর্যাঙ্ক বোন-এপিটিটে এই সমস্যাটি সমাধান করছিলাম এবং সংকলনের সময় নিম্নলিখিত ত্রুটিটি পেয়েছি এখানে চিত্র বর্ণনা লিখুন

সুতরাং লাইন দ্বারা প্রোগ্রাম লাইনে ইনপুট দেওয়ার পরিবর্তে স্থানটি পৃথক পূর্ণসংখ্যার 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
ওপি কীভাবে এটি সমাধান করতে পারে তার কয়েকটি উদাহরণ দিয়ে আপনি আরও কিছুটা ব্যাখ্যা করতে পারেন?
fmittedez

ফাঁকা মান মানে ফাঁকা যা স্ট্রিং ফ্লোটে রূপান্তর করা যায়। আপনি যদি
ভাসাতেও

0

একই ফাইলের অবজেক্টের জন্য লুপের জন্য রিডলাইনগুলি () ভিতরে ব্যবহার করার চেষ্টা করার সময় আমি একই সমস্যার মধ্যে পড়েছিলাম ... আমার সন্দেহ একই ফাইলের অবজেক্টের জন্য রিডলাইন () এর ভিতরে রিডলিং () ফায়ার করছে this

সর্বোত্তম সমাধানটি ফাইল পয়েন্টারটি পুনরায় সেট করতে (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 এর সাথে int () এর জন্য অবৈধ আক্ষরিক উল্লেখ করে ValueError নিক্ষেপ করবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.