ConfigParser
موديل ConfigParser لمعالجة ملفات ال .ini “لاعلاقة لها بالرجيسترى!”
ملف ال .ini نوع قديم من وصف البيانات ومستخدم بكثرة فى التطبيقات القديمة نسبيا
مثال
[program]
name = SVM
version = 0.2.4
license = GPLv3
[author]
name = Ahmed Youssef
email = guru.python@gmail.com
هنا فى الملف يوجد 2 sections او قسمين الأول program والثانى author كل منهم بيحوى keys/values “فى بيسموها اوبشنز" براحتك
مثلا ال name هو key تحت ال program section وقيمته SVM
احفظ الملف السابق وليكن tst.cfg
1- استدعى ال ConfigParser موديل
from ConfigParser import *
2- انشئ اوبجكت
cp=SafeConfigParser() #create an object of SafeConfigParser
لاحظ ان فى كذا كلاس RawConfigParser, ConfigParser, SafeConfigParser فال RawConfigParser هو الأب واشتقه ال ConfigParser وهو الأب ل SafeConfigParser لذا قم بإستخدامه دائما
3- قم بقراءة الملف
cp.read("tst.cfg") #read by filename.
ال configparser object اللى انشئناه cp بيقوم بقراءة الملف بإستخدام ال read method
لإضافة سكشن جديد
.set(section, key, value)
لإضافة key جديد تحت القسم section وله قيمة value
للحصول على جميع الأقسام
هل يوجد قسم بإسم section ؟
للحصول على قيمة ل key تحت section
للحصول على كل الoptions تحت section معين
.has_option(section, option)
هل section يحوى option بإسم option ؟
الحصول على list مكونة من tuples بتشمل key, value مثلا
[('name', 'Ahmed Youssef'), ('email', 'guru.python@gmail.com')]
كتابة الملف سواء على ال stdout او فى ملف ما.. الخ الخ
فى مجموعة من ال Errors مثلا NoSectionError, ParsingError, DuplicateSectionError, NoOptionError ودى فى حال محاول الوصول لقسم او اختيار غير موجود او محاولة التكرار او خطأ فى معالجة الملف "كتابة بصورة غير سليمة" وغيرهم..
من الحاجات اللى تهمك.. السكاشن والoptions
SECTCRE = re.compile(
r'\[' # [
r'(?P<header>[^]]+)' # very permissive!
r'\]' # ]
)
OPTCRE = re.compile(
r'(?P<option>[^:=\s][^:=]*)' # very permissive!
r'\s*(?P<vi>[:=])\s*' # any number of space/tab,
# followed by separator
# (either : or =), followed
# by any # space/tab
r'(?P<value>.*)$' # everything up to eol
)
تطبيق على الملف السابق
from ConfigParser import *
import sys
cp=SafeConfigParser() #create an object of SafeConfigParser
cp.read("tst.cfg") #read by filename.
print cp
print "Sections: ", cp.sections()
print "Options under [program]: ", cp.options("program")
print cp.items("author")
cp.add_section("links")
cp.set("links", "pf", "http://www.programming-fr34ks.net")
cp.set("links", "python", "http://www.python.org")
cp.set("author", "website", "http://ahmedyoussef.wordpress.com")
#print it out...
for sec in cp.sections():
print "--%s:"%sec
for key, value in cp.items(sec):
print "\t", key, " = ", value
print "--------"
cp.write(sys.stdout)
الناتج
<ConfigParser.SafeConfigParser instance at 0xb7dc0f8c>
Sections: ['program', 'author']
Options under [program]: ['version', 'name', 'license']
[('name', 'Ahmed Youssef'), ('email', 'guru.python@gmail.com')]
--program:
version = 0.2.4
name = SVM
license = GPLv3
--links:
python = http://www.python.org
pf = http://www.programming-fr34ks.net
--author:
website = http://ahmedyoussef.wordpress.com
name = Ahmed Youssef
email = guru.python@gmail.com
--------
[program]
version = 0.2.4
name = SVM
license = GPLv3
[links]
python = http://www.python.org
pf = http://www.programming-fr34ks.net
[author]
website = http://ahmedyoussef.wordpress.com
name = Ahmed Youssef
email = guru.python@gmail.com
راجع ConfigParser.py للإطلاع على المزيد
Using CSV
Parsing CSV Files
CSV هى اختصار ل comma separated values من الأسم واضح انها تستخدم فى تمثيل قيم مع فصلها بإستخدام الفاصلة (الcomma) فى صفوف (تستخدم عادة فى استيراد او تصدير بيانات ما ربما قاعدة بيانات مثلا؟)
لاحظ ممكن يكون الفاصل مجرد مسافة او سلاش / او او او ولكن الأشهر هو ال فاصلة
مثال
ahmed, 19, m
ayman, 20, m
وقد تحتوى على صف اول يمثل الهيدر (يشمل عناوين الأعمدة)
name, age, sex
ahmed, 19, m
ayman, 20, m
على فرض لدينا ملف بإسم somefile.csv وفيه البيانات التالية
ahmed, m, 19
wael, m, 20
radwa, f, 19
gina, f, 21
ayman, m, 20
استدعى ال csv module كالتالى
قم بإنشاء reader object “مسئول عن القراءة للملف ومعالجته" بإستخدام cvs.reader()
reader=csv.reader(open("somefile.csv", "rb")) #default dialect. #b as a catch for win32
.
تقدر تستخدم ال for loop مع ال reader فهى تقوم بعمل yield لكل صف يتم قراءته وللحصول على رقم الصف استخدم ال line_num
for row in reader:
print row, " at: ", reader.line_num
فلنقم بتحسين المثال بعض الشئ
import csv
f=open("somefile.csv", "rb")
try:
reader=csv.reader(f) #default dialect. #b as a catch for win32.
for row in reader:
print row, " at: ", reader.line_num
except Exception, ex:
print ex.message
finally:
f.close()
اذا اردت ربط الصف بقاموس وذلك بتحديد اسماء الأعمدة كالتالى
reader=csv.DictReader(f, fieldnames=("name", "age", "sex")) #default dialect. #b as a catch for win32.
for row in reader:
print row, " at: ", reader.line_num
print row["name"] #the name column
للكتابة الموضوع سهل ايضا
بتنشئ writer (كاتب) من csv.writer
تكتب الheader (اسماء الاعمدة) بإستخدام الطريقة writer.writerow
وتعمل دوارة على المدخلات لكتابة كل صف
على سبيل المثال
import csv
f=open("somefile1.csv", "w")
try:
writer=csv.writer(f)
inputrows=(
(1, "ahmed", "ahmedf1@gmail.com"),
(2, "ayman", "aymanf2@gmail.com"),
(3, "smsm", "smsm@yahoo.com")
)
headers=("id", "user", "email")
writer.writerow(headers)
for row in inputrows:
writer.writerow(row)
except Exception, ex:
print ex.message
finally:
f.close()
للمزيد حول ال CSV راجع وثائق بايثون