مشكلة وحل 18: حل خطأ ValueError عند تحويل النص إلى رقم في Python للمبتدئين

مشكلة وحل 18 حل خطأ ValueError عند تحويل النص إلى رقم في Python للمبتدئين

من أكثر الأخطاء التي تظهر للمبتدئين في Python خطأ ValueError عند تحويل النص إلى رقم، خصوصًا عند استخدام input() مع int() أو float(). قد تكتب برنامجًا بسيطًا يطلب من المستخدم إدخال عمره أو درجته أو سعر منتج، ثم تفاجأ أن البرنامج توقف وظهر خطأ طويل.

في هذا المقال من سلسلة مشكلة وحل على بايثون العرب سنشرح سبب ظهور هذا الخطأ، وما معنى الرسالة invalid literal for int() with base 10، وكيف تحل المشكلة بطريقة صحيحة باستخدام التحقق من الإدخال أو باستخدام try و except.

{getToc} $title={محتوى المقال}


الخلاصة السريعة: يظهر خطأ ValueError عند محاولة تحويل نص لا يمثل رقمًا صحيحًا إلى رقم باستخدام int() أو float(). الحل هو تنظيف النص، أو استخدام try except للتعامل مع الإدخال الخاطئ. {alertInfo}

شكل الخطأ

قد يظهر الخطأ بهذا الشكل:

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

أو بهذا الشكل:

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

ومعناه أن Python حاولت تحويل نص إلى رقم صحيح باستخدام int()، لكنها لم تستطع لأن النص لا يصلح أن يكون رقمًا صحيحًا.

مثال يسبب خطأ ValueError

انظر إلى هذا المثال:

age = int(input("أدخل عمرك: "))

print("عمرك هو:", age)

إذا كتب المستخدم رقمًا مثل:

25

سيعمل البرنامج بشكل طبيعي. لكن إذا كتب:

abc

أو ترك الإدخال فارغًا، سيظهر خطأ ValueError لأن int() لا تستطيع تحويل abc أو النص الفارغ إلى رقم صحيح.


شرح سبب ظهور ValueError عند تحويل نص غير رقمي إلى int في Python

لماذا يحدث هذا الخطأ؟

الدالة input() في Python ترجع دائمًا نصًا String، حتى لو كتب المستخدم رقمًا. لذلك نستخدم int() أو float() لتحويل النص إلى رقم.

المشكلة تظهر عندما لا يكون النص قابلًا للتحويل إلى رقم.

القيمة النصية هل تصلح مع int؟ السبب
"25" نعم تمثل رقمًا صحيحًا
"0" نعم تمثل رقمًا صحيحًا
"12.5" لا مع int() مباشرة تحتوي على فاصلة عشرية
"abc" لا حروف وليست رقمًا
"" لا نص فارغ
"10 years" لا يحتوي على رقم ونص معًا

الفرق بين int و float في التحويل

الدالة int() تستخدم لتحويل النص إلى رقم صحيح، مثل 10 أو 25. أما float() فتستخدم لتحويل النص إلى رقم عشري، مثل 10.5 أو 3.14.

x = int("25")
y = float("12.5")

print(x)
print(y)

الناتج:

25
12.5

لكن هذا المثال يسبب خطأ:

number = int("12.5")

لأن "12.5" لا يمثل رقمًا صحيحًا مباشرًا، بل يمثل رقمًا عشريًا. في هذه الحالة استخدم float():

number = float("12.5")

أمثلة صحيحة وخاطئة لتحويل النص إلى رقم في Python باستخدام int و float

الحل الأول: استخدام try و except

أفضل حل عملي للتعامل مع إدخال المستخدم هو استخدام try و except. بهذه الطريقة إذا أدخل المستخدم قيمة غير صالحة، لا يتوقف البرنامج فجأة، بل تعرض له رسالة واضحة.

try:
    age = int(input("أدخل عمرك: "))
    print("عمرك هو:", age)
except ValueError:
    print("خطأ: من فضلك أدخل رقمًا صحيحًا فقط")

إذا كتب المستخدم abc بدل رقم، سيظهر:

خطأ: من فضلك أدخل رقمًا صحيحًا فقط
أفضل ممارسة: عند التعامل مع إدخال المستخدم، لا تفترض أن المستخدم سيدخل قيمة صحيحة دائمًا. استخدم try except لحماية البرنامج من التوقف. {alertSuccess}

حل خطأ ValueError عند استخدام input و int في Python باستخدام try و except

الحل الثاني: تنظيف النص باستخدام strip

أحيانًا يكون سبب المشكلة وجود مسافات قبل الرقم أو بعده. في كثير من الحالات تستطيع int() التعامل مع المسافات، لكن استخدام strip() يجعل الكود أوضح، خصوصًا عندما تتعامل مع ملفات أو بيانات نصية.

text = " 25 "

number = int(text.strip())

print(number)

الناتج:

25

الدالة strip() تزيل المسافات من بداية ونهاية النص.

الحل الثالث: التحقق باستخدام isdigit

يمكن استخدام isdigit() لمعرفة هل النص يحتوي على أرقام فقط أم لا.

text = input("أدخل رقمًا: ")

if text.isdigit():
    number = int(text)
    print("الرقم هو:", number)
else:
    print("الإدخال ليس رقمًا صحيحًا")

لكن انتبه: isdigit() لا تتعامل جيدًا مع الأرقام السالبة أو الأرقام العشرية.

القيمة نتيجة isdigit ملاحظة
"25" True رقم صحيح موجب
"-25" False بسبب علامة السالب
"12.5" False بسبب النقطة العشرية
"abc" False نص عادي

الحل الرابع: التعامل مع الأرقام العشرية باستخدام float

إذا كنت تتوقع أن يدخل المستخدم رقمًا عشريًا، فلا تستخدم int() مباشرة. استخدم float().

try:
    price = float(input("أدخل السعر: "))
    print("السعر هو:", price)
except ValueError:
    print("من فضلك أدخل رقمًا صالحًا")

ماذا لو كان النص يحتوي على فاصلة؟

بعض المستخدمين قد يكتبون الرقم بهذا الشكل:

1,000

الدالة int() لن تحول هذا النص مباشرة بسبب وجود الفاصلة. يمكن إزالة الفاصلة أولًا:

text = "1,000"

clean_text = text.replace(",", "")
number = int(clean_text)

print(number)

الناتج:

1000
تنبيه: لا تنظف النصوص عشوائيًا في البرامج المهمة. افهم شكل البيانات المتوقع أولًا، ثم نظفها بطريقة مناسبة. {alertWarning}

مثال عملي: برنامج حساب العمر

هذا مثال شائع للمبتدئين. نريد أن يطلب البرنامج عمر المستخدم، ثم يطبع العمر بعد سنة.

الكود الذي يسبب المشكلة

age = int(input("أدخل عمرك: "))

print("عمرك بعد سنة:", age + 1)

الكود بعد الحل

try:
    age = int(input("أدخل عمرك: "))
    print("عمرك بعد سنة:", age + 1)
except ValueError:
    print("من فضلك أدخل العمر بالأرقام فقط")

مثال عملي: حساب المجموع من إدخال المستخدم

لنفترض أن المستخدم يدخل رقمين، ونريد جمعهما.

try:
    num1 = float(input("أدخل الرقم الأول: "))
    num2 = float(input("أدخل الرقم الثاني: "))

    total = num1 + num2

    print("المجموع:", total)
except ValueError:
    print("خطأ: يجب إدخال أرقام فقط")

أسباب خطأ ValueError عند تحويل النص إلى رقم

السبب مثال الحل
إدخال حروف بدل رقم "abc" استخدم try except
ترك الإدخال فارغًا "" تحقق من النص قبل التحويل
رقم عشري مع int() "12.5" استخدم float()
وجود نص مع الرقم "10 years" نظف البيانات أو اطلب إدخالًا صحيحًا
وجود فاصلة في الرقم "1,000" استخدم replace() بحذر

ملخص أسباب خطأ ValueError عند تحويل النص إلى رقم في Python وحلولها للمبتدئين

أخطاء شائعة عند حل المشكلة

1. استخدام int مباشرة مع input دائمًا

هذا قد يعمل عندما يدخل المستخدم رقمًا صحيحًا، لكنه يتوقف عند أول إدخال خاطئ.

number = int(input("أدخل رقمًا: "))

الأفضل في البرامج التعليمية الجادة:

try:
    number = int(input("أدخل رقمًا: "))
except ValueError:
    print("إدخال غير صحيح")

2. استخدام isdigit مع الأرقام العشرية

إذا كنت تتوقع رقمًا عشريًا، لا تعتمد على isdigit() فقط، لأنها سترجع False مع "12.5".

3. عدم توضيح الخطأ للمستخدم

بدل رسالة عامة مثل:

حدث خطأ

اكتب رسالة أوضح:

من فضلك أدخل رقمًا صحيحًا مثل 10 أو 25

حل متقدم قليلًا: إعادة طلب الإدخال حتى يكتب المستخدم رقمًا صحيحًا

في بعض البرامج، لا تريد إنهاء البرنامج عند إدخال خاطئ، بل تريد أن تطلب من المستخدم المحاولة مرة أخرى.

while True:
    try:
        age = int(input("أدخل عمرك: "))
        break
    except ValueError:
        print("إدخال غير صحيح، حاول مرة أخرى")

print("عمرك هو:", age)

متى أستخدم int ومتى أستخدم float؟

الحالة استخدم مثال
العمر int() 25
عدد الطلاب int() 30
السعر float() 12.5
الوزن float() 70.5
النسبة المئوية float() 85.5

روابط داخلية مفيدة

روابط خارجية للتوسع

تمرين بسيط

اكتب برنامجًا يطلب من المستخدم إدخال درجته في الاختبار، ثم:

  • إذا أدخل رقمًا صحيحًا أو عشريًا، يطبع الدرجة.
  • إذا أدخل نصًا غير صالح، يطبع رسالة خطأ واضحة.
  • إذا كانت الدرجة أقل من صفر أو أكبر من 100، يطبع أن الدرجة خارج النطاق.

حل مقترح:

try:
    grade = float(input("أدخل درجتك: "))

    if grade < 0 or grade > 100:
        print("الدرجة يجب أن تكون بين 0 و 100")
    else:
        print("درجتك هي:", grade)

except ValueError:
    print("خطأ: أدخل رقمًا فقط")

الخلاصة

يظهر خطأ ValueError عند تحويل النص إلى رقم عندما تكون القيمة النصية غير مناسبة للتحويل. مثلًا، int("abc") أو int("") أو int("12.5") ستسبب مشكلة لأن int() تتوقع رقمًا صحيحًا.

أفضل حل عند التعامل مع المستخدم هو استخدام try و except ValueError، مع رسالة واضحة تساعد المستخدم على تصحيح الإدخال. وإذا كنت تتعامل مع أرقام عشرية فاستخدم float() بدل int().

الخلاصة العملية: لا تثق بإدخال المستخدم مباشرة. حوّل النص إلى رقم داخل try، وتعامل مع ValueError برسالة واضحة. {alertSuccess}

أسئلة شائعة مع إجاباتها

ما سبب خطأ ValueError عند استخدام int؟

يحدث الخطأ عندما تحاول تحويل نص لا يمثل رقمًا صحيحًا إلى رقم باستخدام int()، مثل "abc" أو "" أو "12.5".

كيف أحل ValueError عند تحويل input إلى int؟

استخدم try و except ValueError حتى لا يتوقف البرنامج إذا أدخل المستخدم قيمة غير صالحة.

هل يمكن تحويل 12.5 باستخدام int؟

لا يمكن تحويل النص "12.5" مباشرة باستخدام int(). استخدم float("12.5") إذا كنت تريد رقمًا عشريًا.

ما الفرق بين int و float؟

int() تستخدم للأرقام الصحيحة مثل 10، أما float() فتستخدم للأرقام العشرية مثل 10.5.

هل isdigit تحل المشكلة دائمًا؟

لا. isdigit() مفيدة للأرقام الصحيحة الموجبة، لكنها لا تعمل جيدًا مع الأرقام السالبة أو العشرية.

ما معنى invalid literal for int with base 10؟

تعني أن النص الذي حاولت تحويله إلى رقم صحيح لا يناسب نظام الأرقام العشرية، مثل تحويل "abc" أو "10 years" باستخدام int().

إرسال تعليق

أحدث أقدم