من أكثر الأخطاء التي تظهر للمبتدئين في 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 أو النص الفارغ إلى رقم صحيح.
لماذا يحدث هذا الخطأ؟
الدالة 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")
الحل الأول: استخدام try و except
أفضل حل عملي للتعامل مع إدخال المستخدم هو استخدام try و except. بهذه الطريقة إذا أدخل المستخدم قيمة غير صالحة، لا يتوقف البرنامج فجأة، بل تعرض له رسالة واضحة.
try:
age = int(input("أدخل عمرك: "))
print("عمرك هو:", age)
except ValueError:
print("خطأ: من فضلك أدخل رقمًا صحيحًا فقط")
إذا كتب المستخدم abc بدل رقم، سيظهر:
خطأ: من فضلك أدخل رقمًا صحيحًا فقط
أفضل ممارسة: عند التعامل مع إدخال المستخدم، لا تفترض أن المستخدم سيدخل قيمة صحيحة دائمًا. استخدم try except لحماية البرنامج من التوقف. {alertSuccess}
الحل الثاني: تنظيف النص باستخدام 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() بحذر |
أخطاء شائعة عند حل المشكلة
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 |
روابط داخلية مفيدة
- أساسيات بايثون 7: أنواع البيانات في Python للمبتدئين
- أساسيات بايثون 11: شرح if و else في Python للمبتدئين
- أساسيات بايثون 23: شرح try و except في Python والتعامل مع الأخطاء
- حل خطأ ValueError invalid literal for int في بايثون
- محرر بايثون العرب لتجربة الأكواد أونلاين
روابط خارجية للتوسع
- توثيق Python الرسمي للدالة int
- توثيق Python الرسمي للدالة float
- توثيق Python الرسمي لخطأ ValueError
- شرح الأخطاء والاستثناءات في توثيق Python الرسمي
تمرين بسيط
اكتب برنامجًا يطلب من المستخدم إدخال درجته في الاختبار، ثم:
- إذا أدخل رقمًا صحيحًا أو عشريًا، يطبع الدرجة.
- إذا أدخل نصًا غير صالح، يطبع رسالة خطأ واضحة.
- إذا كانت الدرجة أقل من صفر أو أكبر من 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().




