Python Programming

تحويل سلاسل النصوص إلى أرقام بكفاءة في بايثون

Spread the love

توفر بايثون عدة طرق لتحويل السلاسل النصية التي تمثل أعدادًا إلى نظيراتها العددية (أعداد عشرية أو صحيحة). تعتمد الطريقة المثلى على عوامل مثل تنسيق سلسلة الإدخال المتوقع، واحتياجات معالجة الأخطاء، واعتبارات الأداء. تستعرض هذه المقالة هذه التقنيات ومواطن التوازن بينها.

جدول المحتويات

  1. استخدام float() لتحويل السلاسل النصية إلى أعداد عشرية
  2. استخدام int() لتحويل السلاسل النصية إلى أعداد صحيحة
  3. التحويل الآمن باستخدام ast.literal_eval()
  4. معالجة التوطين والفاصلات
  5. مقارنة أداء طرق التحويل

1. استخدام float() لتحويل السلاسل النصية إلى أعداد عشرية

أبسط نهج هو استخدام دالة float() المدمجة. تحاول تحليل السلسلة النصية إلى ما يعادلها من الأعداد العشرية. إذا لم تكن السلسلة النصية تمثل عددًا عشريًا صحيحًا (مثل: تحتوي على أحرف غير رقمية)، فسيتم إثارة خطأ ValueError.


string_number = "3.14159"
float_number = float(string_number)
print(float_number)  # الإخراج: 3.14159

string_number = "10"
float_number = float(string_number)
print(float_number)  # الإخراج: 10.0

try:
    invalid_number = float("abc")
except ValueError:
    print("سلسلة نصية غير صالحة للتحويل إلى عدد عشري")  # الإخراج: سلسلة نصية غير صالحة للتحويل إلى عدد عشري

2. استخدام int() لتحويل السلاسل النصية إلى أعداد صحيحة

وبالمثل، تقوم دالة int() بتحويل السلاسل النصية إلى أعداد صحيحة. كما أنها تُثير خطأ ValueError إذا لم تمثل السلسلة النصية عددًا صحيحًا؛ فستتسبب الأجزاء الكسرية في حدوث خطأ.


string_number = "10"
int_number = int(string_number)
print(int_number)  # الإخراج: 10

try:
    invalid_number = int("3.14")
except ValueError:
    print("سلسلة نصية غير صالحة للتحويل إلى عدد صحيح")  # الإخراج: سلسلة نصية غير صالحة للتحويل إلى عدد صحيح

try:
    invalid_number = int("abc")
except ValueError:
    print("سلسلة نصية غير صالحة للتحويل إلى عدد صحيح")  # الإخراج: سلسلة نصية غير صالحة للتحويل إلى عدد صحيح

3. التحويل الآمن باستخدام ast.literal_eval()

توفر دالة ast.literal_eval() من وحدة ast بديلًا أكثر أمانًا، خاصة عند التعامل مع إدخال غير موثوق. تقوم بتحليل السلسلة النصية باستخدام شجرة التحليل النحوي المجردة (AST) الخاصة ببايثون، مما يمنع تنفيذ التعليمات البرمجية الضارة المضمنة داخل السلسلة النصية. هذا أمر حيوي للأمان عند التعامل مع البيانات الخارجية.


import ast

string_number = "3.14159"
float_number = ast.literal_eval(string_number)
print(float_number)  # الإخراج: 3.14159

string_number = "10"
int_number = ast.literal_eval(string_number)
print(int_number)  # الإخراج: 10

try:
    unsafe_input = ast.literal_eval("__import__('os').system('rm -rf /')")  # هذا سيُثير خطأ
except (ValueError, SyntaxError):
    print("منعَت ast.literal_eval() تنفيذ التعليمات البرمجية الضارة")

4. معالجة التوطين والفاصلات

في بعض المناطق، تستخدم الأعداد الفواصل كفاصلات آلاف (مثل: “1,000.50”). لن تعالج float() هذه مباشرة. قم بمعالجة السلسلة النصية مسبقًا عن طريق استبدال الفواصل بنقاط (أو العكس، حسب منطقتك) قبل التحويل. يمكن لوحدة locale المساعدة في التنسيق الخاص بكل منطقة.


import locale

locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')  # مثال لمنطقة الولايات المتحدة

string_number = "1,000.50"
processed_number = string_number.replace(",", "")
float_number = float(processed_number)
print(float_number)  # الإخراج: 1000.5

#للمناطق التي تستخدم '.' كفاصل آلاف و ',' كفاصل عشري
string_number = "1.000,50"
processed_number = string_number.replace(".", "").replace(",", ".")
float_number = float(processed_number)
print(float_number) #الإخراج: 1000.5

5. مقارنة أداء طرق التحويل

تُعد float() و int() الأسرع بشكل عام. ast.literal_eval() أبطأ بسبب زيادة تكلفة تحليل AST. ومع ذلك، غالبًا ما تفوق مزاياها الأمنية فرق الأداء، خاصةً مع الإدخال غير الموثوق. بالنسبة لمجموعات البيانات الكبيرة حيث يكون الأداء أمرًا بالغ الأهمية والبيانات موثوقة، يُفضل استخدام float() و int(). بالنسبة لمجموعات البيانات الأصغر أو عندما يكون الأمان ذا أهمية قصوى، فإن ast.literal_eval() هو الخيار الأكثر أمانًا. يمكن أن توفر الاختبارات المعيارية باستخدام timeit مقارنات كمية.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *