Author Topic: ConfigParser  (Read 806 times)

Ahmed Youssef

  • Helping Freak
  • Administrator
  • Active Member
  • *****
  • Posts: 242
    • View Profile
    • WWW
    • Email
ConfigParser
« on: November 13, 2008, 03:07:59 AM »
ConfigParser

موديل ConfigParser لمعالجة ملفات ال .ini “لاعلاقة لها بالرجيسترى!”
ملف ال .ini نوع قديم من وصف البيانات ومستخدم بكثرة فى التطبيقات القديمة نسبيا
مثال
Code: [Select]
[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 موديل
Code: [Select]
from ConfigParser import *

2- انشئ اوبجكت
Code: [Select]
cp=SafeConfigParser() #create an object of SafeConfigParser


لاحظ ان فى كذا كلاس RawConfigParser, ConfigParser, SafeConfigParser فال RawConfigParser هو الأب واشتقه ال ConfigParser وهو الأب ل SafeConfigParser لذا قم بإستخدامه دائما

3- قم بقراءة الملف
Code: [Select]
cp.read("tst.cfg") #read by filename.

ال configparser object اللى انشئناه cp بيقوم بقراءة الملف بإستخدام ال read method
Code: [Select]
.add_section(section)

لإضافة سكشن جديد
Code: [Select]
.set(section, key, value)

لإضافة key جديد تحت القسم section وله قيمة value
Code: [Select]
.sections()

للحصول على جميع الأقسام
Code: [Select]
.has_section(section)

هل يوجد قسم بإسم section ؟
Code: [Select]
.get(section, key)

للحصول على قيمة ل key تحت section
Code: [Select]
.options(section)


للحصول على كل الoptions تحت section معين
Code: [Select]
.has_option(section, option)

هل section يحوى option بإسم option ؟
Code: [Select]
.items(section)

الحصول على list مكونة من tuples بتشمل key, value  مثلا
Code: [Select]
[('name', 'Ahmed Youssef'), ('email', 'guru.python@gmail.com')]

Code: [Select]
.write(fp)

كتابة الملف سواء على ال stdout او فى ملف ما.. الخ الخ
فى مجموعة من ال Errors مثلا NoSectionError, ParsingError,  DuplicateSectionError, NoOptionError ودى فى حال محاول الوصول لقسم او اختيار غير موجود او محاولة التكرار او خطأ فى معالجة الملف "كتابة بصورة غير سليمة" وغيرهم..

من الحاجات اللى تهمك.. السكاشن والoptions
Code: [Select]
    SECTCRE = re.compile(

        r'\['                                 # [

        r'(?P<header>[^]]+)'                  # very permissive!

        r'\]'                                 # ]

        )

Code: [Select]
    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

        )


تطبيق على الملف السابق
Code: [Select]
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)


الناتج
Code: [Select]
<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) فى صفوف (تستخدم عادة فى استيراد او تصدير بيانات ما ربما قاعدة بيانات مثلا؟)
لاحظ ممكن يكون الفاصل مجرد مسافة او سلاش / او او او ولكن الأشهر هو ال فاصلة
مثال
Code: [Select]
ahmed, 19, m 
ayman, 20, m

وقد تحتوى على صف اول يمثل الهيدر (يشمل عناوين الأعمدة)
Code: [Select]
name, age, sex
ahmed, 19, m
ayman, 20, m



على فرض لدينا ملف بإسم somefile.csv وفيه البيانات التالية
Code: [Select]
ahmed, m, 19
wael, m, 20
radwa, f, 19
gina, f, 21
ayman, m, 20

استدعى ال csv module كالتالى
Code: [Select]
import csv

قم بإنشاء reader object “مسئول عن القراءة للملف ومعالجته" بإستخدام cvs.reader()
Code: [Select]
reader=csv.reader(open("somefile.csv", "rb")) #default dialect. #b as a catch for win32
.
تقدر تستخدم ال for loop مع ال reader فهى تقوم بعمل yield لكل صف يتم قراءته وللحصول على رقم الصف استخدم ال line_num
Code: [Select]
for row in reader:
    print row, " at: ", reader.line_num

فلنقم بتحسين المثال بعض الشئ
Code: [Select]
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()


اذا اردت ربط الصف بقاموس وذلك بتحديد اسماء الأعمدة كالتالى
Code: [Select]
    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
وتعمل دوارة على المدخلات لكتابة كل صف
على سبيل المثال
Code: [Select]
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 راجع وثائق بايثون




« Last Edit: January 11, 2009, 02:56:46 PM by Ahmed Youssef »
Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/