= 'Adam'
name = "Makkah, Saudi Arabia" address
9 النص
النص (str
) صف من الأحرف. وهو تسلسل ثابت من أرقام الترميز العالمي (Unicode) التي هي رموز تتبع ترميزًا عالميًا يحوي جميع أحرف اللغات بالإضافة إلى علامات الترقيم والرسوم (مثل: 💡🔍📐) ونحوها.
النص الطبيعي
النص الطبيعي (الحر أو البشري) هو ما لا يتبع هيكلاً أو قالبًا يحكم طريقة كتابته؛ وهو يطول ويقصر من الحرف الواحد إلى مجموعة الأحرف إلى الكلمة إلى الجملة وإلى أكبر من ذلك نحو:
- محادثات وسائل التواصل الاجتماعي
- رسائل البريد الإلكتروني
- مقالات
- كتب
- موسوعات
- صفحات الشبكة
- مواقع الشبكة
وأوجه معالجة النصوص الحرة كثيرة منها: الفهرسة والبحث والاستبدال والعد والتصنيف والترتيب والقولبة …إلخ.
النص المُقَوْلَب
النص المقولَب الذي يأخذ شكلاً محددًا؛ وله صيغ متعددة يُنشئ الناس منها قوالب للنص لتمثل مجموعات أو ارتباطات من البيانات، كالجداول ونحوها.
وصيغ القولبة كثيرة من أشهرها: XML
, YAML
, JSON
, CSV
مثال لقالب بصيغة YAML
:
---
Name: Adam
Age: 25
City: Riyadh
مثال لقالب بصيغة JSON
:
{
"Name": "Adam",
"Age": 25,
"City": "Riyadh"
}
وهذا مثال لقالب بصيغة XML
:
person>
<name>Adam</name>
<age>25</age>
<city>Riyadh</city>
<person> </
والصيغة التي تستعمل كثيرًا لتمثيل الجداول (صفوف) هي صيغة CSV
. فكل سطرٍ هو صفٌّ في الجدول، وأوَّلُ سطرٍ هو رأس الجدول عادةً. وذلك على النحو التالي:
Name,Age,City
Adam,25,Riyadh
Belal,30,Jeddah
Camal,35,Dammam
جرب أن تُنشئ ملفًّا نصيًّا وتكتب فيه ذلك وتحفظه بصيغة csv
ثم سترى أنه يمكنك فتحه بمحرر جداول (:مثل إكسل - Excel).
إنشاء النص
جملة إنشاء النص في بايثون تكون كالتالي:
- بعلامة اقتباس مفردة:
'السلام عليكم!'
- أو بعلامة اقتباس مزدوجة:
"السلام عليكم!"
وليس بينهما فرق. - أو بعلامة اقتاس مكررة ثلاثة مرات:
"""السلام عليكم!"""
للنص الجاري على أكثر من سطر.
على سبيل المثال:
تأمل إنشاء هذا النص الذي يبتدئ في السطر الأول ويمتد لأربعة أسطر:
= """السلام عليكم ورحمة الله وبركاته,
message أبشركم بأنكم قطعتم نصف المشوار.
شكرًا لكم.
أخوكم آدم.
"""
print(message)
السلام عليكم ورحمة الله وبركاته,
أبشركم بأنكم قطعتم نصف المشوار.
شكرًا لكم.
أخوكم آدم.
قراءة الملفات النصية
وكثيرًا ما يكون وجود النص في البرنامج ناتجًا عن قراءة ملف نصي بالإجراء open()
وذلك بإضافة الحرف r
ميشرًا إلى أن غرض الفتح للقراءة (ويجب أن يكون الملف موجودًا إلى جانب البرنامج - أي: في نفس المجلد الذي يوجد فيه البرنامج):
file = open('my_file.txt', 'r')
= file.read()
message file.close()
print(message)
وسيأتي تفصيل كيفية التعامل مع الملفات في باب الملفات.
الإشارة لجزء من النص
ولكون النص تسلسلاً ثابتًا فإنه يقبل جميع عمليات التسلسل السابق ذكرها (انظر باب المجموعة المرتبة).
= 'Arabian'
s
= s[0]
first = s[-1]
last print(first + last)
An
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+
| A | r | a | b | i | a | n |
+---+---+---+---+---+---+---+
-7 -6 -5 -4 -3 -2 -1
جرب
s[1:5]
s[1:5:2]
s[::2]
s[::-1]
لاحظ أن هذا يتحقق كما لو عرفنا صفًّا بالأحرف هذه نفسها:
= ('A', 'r', 'a', 'b', 'i', 'a', 'n')
s = s[0]
first = s[-1]
last print(first + last)
An
لكن الفرق أن النص نوعٌ له إجراءات / عمليات خاصة تتعلق بالنصوص.
النص ثابت لا يقبل التغير
فالنص تسلسل يشبه الصف في كوْنه ثابتًا (أي لا يقبل تعديل عنصر أو إضافته أو حذفه). فلو حاولت تغيير موضعٍ s[i]
في النص أو قطعة s[i:j]
فإنك ستواجه خطأ:
= 'Arabian'
s 0] = 'a' s[
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[5], line 2 1 s = 'Arabian' ----> 2 s[0] = 'a' TypeError: 'str' object does not support item assignment
لكننا لتعديل النص في الواقع نعيِّنُ إلى نفس المتغير نصًّا جديدًا منه:
= 'Arabian'
s = 'a' + s[1:]
s print(s)
arabian
لاحظ أننا أسندنا النص الجديد إلى المتغير s
، وهذا يعني أننا لم نعدل النص الأصلي بل أنشأنا نصًا جديدًا.
العمليات الخاصة بالنصوص
الاستبدال
لاستبدال جزء من النص، نستخدم فعل .replace()
:
= 'Arabian'
s = s.replace('ian', 'y')
s print(s)
Araby
إزالة المسافات
كما لدينا علميات .strip()
لإزالة المسافات البيضاء من بداية ونهاية النص.
assert ' Arabian '.strip() == 'Arabian'
البحث والمطابقة
وكذلك لدينا عمليات البحث:
- التحقق من البدء والنهاية وما بينهما:
.startswith(prefix)
و.endswith(suffix)
أوsub in string
وهي أعم. - لمعرفة موضع أول ظهور لسلسلة معيَّنة من الأحرف داخل النص
.find()
= 'Arabian'
s assert s.startswith('A')
assert not s.startswith('a')
assert s.endswith('n')
assert 'rabia' in s
assert s.find('a') == 2
الفصل والوصل
- فصل النص لقائمة بناءً على جزء فاصل:
list.split(seperator)
- وصل عناصر القائمة في نص مفصول بجزء فاصل:
seperator.join(list)
أولاً: الفصل: مثاله قراءة سطر في ملف csv
إذْ القيم مفصولة بعلامة الفاصلة ,
:
= "Adam,25,Riyadh"
csv assert csv.split(',') == ['Adam', '25', 'Riyadh']
ولقراءة الملف كاملاً نكرر:
- القيم في السطر الواحد مفصولة بعلامة الفاصلة
,
- والصفوف مفصولة بعلامة السطر الجديد
\n
لذلك سنستعمل الاثنين هنا:
= """name,age,city
csv Adam,25,Riyadh
Belal,30,Jeddah
Camal,35,Dammam"""
= []
data for line in csv.split(sep='\n'):
= line.split(sep=',')
row
data.append(row)print(data)
[['name', 'age', 'city'], ['Adam', '25', 'Riyadh'], ['Belal', '30', 'Jeddah'], ['Camal', '35', 'Dammam']]
ثانيًا: الوَصل: مثاله أننا نحول القائمة إلى نص مفصول بعلامة الفاصلة ,
وذلك ليكون سطرًا في ملف csv
:
= ['Adam', '25', 'Riyadh']
data = ','
seperator = seperator.join(data)
csv assert csv == 'Adam,25,Riyadh'
عمليات إنجليزية
وهنا عمليات خاصة بالنصوص الإنجليزية:
upper()
نسخة ذات حروف كبيرة.lower()
نسخة ذات حروف صغيرة.capitalize()
نسخة ذات حرف أول كبير من كل كلمة.title()
نسخة ذات حالة عنوان.
= 'Adam ibraheeM'
name print(name.upper())
print(name.lower())
print(name.capitalize())
print(name.title())
ADAM IBRAHEEM
adam ibraheem
Adam ibraheem
Adam Ibraheem
وانظر مستندات النصوص لمعرفة كافة الإجراءات الممكنة على النصوص.
تفسير الأرقام
تفسير الأرقام المكتوبة نصًّا تكثر الحاجة إليه خصوصًا عند قراءة ملفات أو التعامل مع بيانات من المستخدم، إذ يكون الإدخال نصيًّا:
int(x)
لتحويل نص إلى عدد صحيح.float(x)
لتحويل نص إلى عدد عشري.
لاحظ ناتج عملية جمع رقمين مكتوبين كنصوص:
= '20'
x = '40'
y print(x + y)
2040
الواجب تحويلهما إلى أعداد أولاًً:
= float(x)
x2 = float(y)
y2 print(x2 + y2)
60.0
إخراج النص
نستعرض ثلاث طرق لدمج النصوص في بايثون:
- الأولى: تحويل الشيء إلى نص قبل دمجه مع النص، باستعمال
str(x)
- الثانية: استعمال فراغات بالقوسين المعكوفين
{}
مع الإجراء.format()
لاستبدالها. - الثالثة: استعمال
f-string
بأن تضع الحرفf
قبل علامة التنصيص الأولى، ليقبل النص وضع القيم مباشرة داخل الأقواس المعكوفة{}
. وهي الطريقة التي نفضلها.
= "John"
name = 300
lvl
= "I am " + name + " and I want to reach level " + str(lvl) # + operator
s1 = "I am {} and I want to reach level {}".format(name, lvl) # .format() method
s2 = f"I am {name} and I want to reach level {lvl}" # f-strings
s3 assert s1 == s2 == s3
print(s1)
I am John and I want to reach level 300
يقبل النص التكرار بعلامة *
:
print('-' * 10)
print('*' * 10)
print('=' * 10)
----------
**********
==========
المحاذاة والحشو
= 'Adam'
name print(name.ljust(15))
print(name.center(15))
Adam
Adam
طريقة ممتعة لتزيين سلسلة نصية باستخدام الإجراء center
:
print('*' * 20)
print('Adam'.center(20, "*"))
print('*' * 20)
********************
********Adam********
********************
تنسيق الأرقام
محاذاة الأرقام
print(f'{100:10}')
print(f'{1000:10}')
print(f'{10000:10}')
100
1000
10000
يمكننا أيضًا جعل كل من العدد n
والتعبئة p
متغيرات:
= 100
n = 5
p print(f'{n:{p}}')
100
بشكل افتراضي، يتم محاذاة الرقم إلى اليمين. يمكننا محاذاته إلى اليسار بإضافة <
. لاحظ الفرق بين التعبيرين أدناه:
print(f'{n:>{p}}')
print(f'{n:<{p}}')
100
100
فاصل الآلاف
= 10000
big_num print(f'{big_num}')
print(f'{big_num:,}')
10000
10,000
الترميز العلمي
= 0.00001
small_num print(f"{small_num:.2e}")
1.00e-05
الأعداد العشرية
= 10.5689
num print(f'{num}')
print(f'{num:.4f}')
print(f'{num:.2f}')
print(f'{num:.0f}')
10.5689
10.5689
10.57
11
مثال: تنسيق الكم المالي
= 2978.95
price_dollars = price_dollars * 3.75
price_riyals print(f"${price_dollars:,.2f} = {price_riyals:,.2f} SAR")
$2,978.95 = 11,171.06 SAR