Author Topic: IO الدخل والخرج  (Read 947 times)

Ahmed Youssef

  • Helping Freak
  • Administrator
  • Active Member
  • *****
  • Posts: 242
    • View Profile
    • WWW
    • Email
IO الدخل والخرج
« on: November 13, 2008, 01:11:04 AM »


هنتكلم فى الفصل دا عن التعامل مع ال files وتحديدا ال IO اختصارا ل Input/Output
ال file type بيعبر عن صف مسئول عن التعامل مع الملفات (ممكن يكون سوكيت او غيره بما ان كل شئ عبارة عن file)

فى اكثر من طريقة لإنشاء file object ودا عن طريق open او file class
open هتعمل ريترن بfile object وهى معرفة كالتالى
open(name, mode, buffering)

حيث name هو مسار الملف
mode هو بيعبر عن حالة الوصول (الملف مفتوح للقراءة ، للكتابة ، للإضافة ؟) الإفتراضى هو r للقراءة

r → قراءة فقط
w → كتابة فقط (بيتم محو كل البيانات الموجودة)
a → للإضافة من عند النهاية ،مع عدم محو البيانات
r+ → قراءة وكتابة
w+ → كتابة وقراءة
اى من ال modes السابقة اذا لحقته ب b اختصارا ل binary سيتم التعامل مع binary read, binary write, .. etc

ال buffering لتحديد هل سيتم عمل اى buffering فى حال التعامل مع الملف، الإفتراضى هو -1 (بيتم النقل لنظام التشغيل)
Code: [Select]
.close()

لغلق ال file object
Code: [Select]
.read(num=None)

بتقوم بقراءة عدد معين من البايتات وفى حال عدم تحديده بيتم قراءة الملف بكامله
Code: [Select]
.readline()

قراءة سطر واحد
Code: [Select]
.readlines()
قراءة كل السطور (على صورة list)

Code: [Select]
.tell()
بتخبرنا بالمكان الحالى
Code: [Select]
.fseek(offset, whence=0)

بتنقل المكان الحالى الى offset معين بعد ال whence
whence ربما تكون 0 (اى بداية الملف ) او1 (المكان الحالى) او 2 (نهاية الملف)
عندنا ملف سميناه iotest.xcd فيه التالى 0123456789
Code: [Select]
.write(s)

يقوم بكتابة s فى الملف
Code: [Select]
.writelines(seq_of_strings)

يقوم بكتابه كل عناصر seq_of_strings فى الملف
--كقيامك بإستدعاء write على كل عنصر فى هذه ال sequence
Code: [Select]
.fileno()

الحصول على File Descriptor خاص بال file
Code: [Select]
.flush()

لتأكيد نقل الbuffer الداخلى كله على الملف

Code: [Select]
.name
للحصول على مسار الملف
Code: [Select]
.mode 

للحصول على ال access mode
Code: [Select]
.encoding

للحصول على الإنكودينج

Code: [Select]
.closed
للتحقق من تحقق اغلاق المسار

Code: [Select]
FNAME="iotest.xcd"
txt="""
line 1
line 2
line 3
line 4
line 5
line 6
line 7
some text
yada yada yada!
"""
f=open(FNAME, "w")
print f.fileno()
print f.name
print f.mode
print f.closed
f.write(txt)
f.close()
print f.closed

فى المثال السابق قمنا بفتح ملف iotext.xcd للكتابة، وكتبنا فى داخله محتويات المتغير txt
الناتج
Code: [Select]
3
iotest.xcd
w
False
True


القراءة
Code: [Select]
f=open(FNAME, "r")
lines=f.readlines()
for line in lines:
    print "LINE = > ", line, #avoid printing a new line.
الناتج
LINE = > 
LINE = >  line 1
LINE = >  line 2
LINE = >  line 3
LINE = >  line 4
LINE = >  line 5
LINE = >  line 6
LINE = >  line 7
LINE = >  some text
LINE = >  yada yada yada!

معاملات سطر الأوامر لبرنامجك

بكل بساطة مش هتحتاج غير ال argument vector ودى موجودة فى ال sys.argv
لو فاكر
int main(int argc, char** argv){

}
فللوصول لل argv استخدم argv الموجودة بال sys module وللحصول على عددهم استخدم len(argv)
Code: [Select]
striky@striky-desktop:~$ python myecho.py hello world 123 "78 yay" 
Number of arguments:  5
myecho.py
hello
world
123
78 yay


Code: [Select]
myecho.py
#!bin/python

from sys import argv # arguments vector.

print "Number of arguments: ", len(argv)

for arg in argv:
        print arg


More IO stuff

فى عندنا 2 modules مهمين هما os, os.path
ضيفهم كالتالى
Code: [Select]
import os
import os.path as op


Code: [Select]
os.uname()

بتعيد tuple مكونة من (sysname, nodename, release, version, machine)

Code: [Select]
print os.uname()

#('Linux', 'striky-desktop', '2.6.24-21-generic', '#1 SMP Tue Oct 21 23:43:45 UTC 2008', 'i686')
         


Code: [Select]
os.getcwd()
بتعيد المسار الحالى
Code: [Select]
print os.getcwd()

/home/striky/workspace/pytut/src

Code: [Select]
os.getcwdu()

مثل سابقتها ولكن بتعمل ريترن ب unicode
Code: [Select]
os.environ

هى dictionary مخزن فيه متغير البيئة environment مثل ال HOME, LOGNAME, PATH,.. etc
للإطلاع عليهم
Code: [Select]
for key, val in os.environ.items():
    print key, " => ", val


للحصول على مفتاح بعينه
Code: [Select]
os.getenv(key, default)

للخصول على قيمة مفتاح ما فى الenviron
Code: [Select]
print os.getenv("HOME")

ال default سيتم اعادتها فى حالة عدم وجود المفتاح

انا root ?
Code: [Select]
def isroot():

return os.getenv("USER")=="root"



طبعا تقدر تستخدم ال keys, values methods الخاصة بال environ dictionary.
Code: [Select]
os.putenv(key, value)

إضافة key لل environment بقيمة value
Code: [Select]
os.unsetenv(key)

حذف key ما
Code: [Select]
os.chdir(to)

بتقوم بنقل المسار الحالى cwd الى to
Code: [Select]
print os.getcwd()

os.chdir("/home/striky")
print os.getcwd()
os.chdir("Music")
print os.getcwd()

output
/home/striky/workspace/pytut/src
/home/striky
/media/s3/Music

لاحظ ان Music هنا symbolic link تحت /home/striky وبيشير ل /media/s3/Music
Code: [Select]
os.listdir(path)

بتقوم بإعادة list من مكونات ال path
Code: [Select]
p=os.getcwd() #/home/striky/workspace/pytut/src
print os.listdir(p)
['userstringtest.py', 'iosess.py', 'gcombo.py', 'iohelpers.py', 'oopsample.py', 'iotest.xcd', 'gtk1.py', 'complpath.py']

Code: [Select]
os.link(src,dest)
بتنشئ hard link من src الى dest
Code: [Select]
os.symlink(src, dest)

بتنشئ symbolic link من src إلى dest
Code: [Select]
os.unlink(path)

حذف path
Code: [Select]
os.remove(path)

مثل os.unlink
Code: [Select]
os.rmdir(path)

لحذف مجلد معين
Code: [Select]
os.rename(src, dest)

اعادة التسمية
Code: [Select]
os.removedirs(path)

بتقوم بالحذف من اسفل لأعلى مثلا
Code: [Select]
os.removedirs('foo/bar/baz')

ستقوم بحذف مجلد baz اولا ثم bar ثم foo
Code: [Select]
chmod(path, mode)

بتقوم بتعديل ال mode على path
Code: [Select]
chown(path, uid, gid)

تحديد ال uid, gid على path معين

Code: [Select]
print os.sep # /
الفاصل العناصر المسار
Code: [Select]
/home/striky 

Code: [Select]
print os.curdir #.

المجلد الحالى وهى ال ".”
Code: [Select]
print os.altsep#None

حرف فاصل بديل
Code: [Select]
print os.pardir#..

المجلد الأب وهى ال "..”
Code: [Select]
print os.extsep#.

الفاصل للإمتدادات وهو ال ".”

Code: [Select]
print os.pathsep#:

الفاصل فى متغير ال PATH وهنا:
Code: [Select]
print repr(os.linesep)#\n

الفاصل بين السطور وهنا هو ال "\n”

Code: [Select]
p=os.getcwd() #/home/striky/workspace/pytut/src
F=p+r'/'+"iohelpers.py"
print op.basename(F)

print op.isfile(F)
print op.islink(F)
print op.isabs(F)
print op.isdir(F)
print op.isdir(p)
print op.ismount("/media/s3")
print op.abspath(F)
print op.dirname(F)
print op.split(F)
print op.splitdrive(F)
print op.splitext(F)
print op.exists(F+"xx")#Nope!
print op.getatime(F) #last access time
print op.getmtime(F) #last modification time
print op.getsize(F)  #file size.

print op.join("/home", "striky", "Music")


الناتج
Code: [Select]
iohelpers.py
True
False
True
False
True
True
/home/striky/workspace/pytut/src/iohelpers.py
/home/striky/workspace/pytut/src
('/home/striky/workspace/pytut/src', 'iohelpers.py')
('', '/home/striky/workspace/pytut/src/iohelpers.py')
False
1226557143.0
1226557142.0
521
/home/striky/Music
('/home/striky/workspace/pytut/src/iohelpers', '.py')


Code: [Select]
exists(path)

هل المسار موجود ؟

Code: [Select]
isfile(path)
هل ال path ملف؟

Code: [Select]
isdir(path)
هل ال path مجلد؟

Code: [Select]
islink(path)
هل ال path عبارة عن link ؟

Code: [Select]
ismount(path)
هل هو عبارة عن نقطة ضم ؟

Code: [Select]
isabs(path)
هل هو المسار بالكامل ؟


Code: [Select]
basename(path)
القاعدة فى المسار

Code: [Select]
abspath(path)
المسار المطلق

Code: [Select]
dirname(path)
اسم المجلد


Code: [Select]
getatime(path)
الحصول على توقيت ال last access

Code: [Select]
getmtime(path)
الحصول على توقيت ال last modification

Code: [Select]
getctime(path)
الحصول على توقيت ال last change او ال last creation اذا كان على windows


Code: [Select]
getsize(path)
الحصول على مساحة path

Code: [Select]
join(a)
لدمج مكونات الpath بإستخدام الفاصل المناسب

Code: [Select]
split(path)
تقوم بإعادة tuple مكونة من ال dirname وال basename

Code: [Select]
splitdrive(path)
تقوم بإعادة tuple مكونة من ال drive, وباقى المسار

Code: [Select]
splitext(path)
تقوم بإعادة tuple مكونة من المسار كامل بدون الإمتداد و الإمتداد


File Pointer

يمكن تكون مليت من إستخدام FileHandler.write
Code: [Select]
>>>F = open(fileName, 'w')
>>>print >> F, 'Hola'  #It will write the Hola word to the file that we opened
>>>F.close()

>>>F=open(fileName, 'r')
>>>for line in F.readlines(): print line

Code: [Select]
Hola  #Output! 


على فرض إنك هتعمل  File ودا معناه إنك هتستخدم ال w' permission'

Code: [Select]
>>> f = open('C:\\2.txt', 'w') #Open 2.txt for writing mode.
>>> print >> f, 'Hola!'  #Add 'Hola' to it
>>> print >> f, 'Hello!' # same
>>> print >> f, 'Using File Pointer !' #the same
>>> f.close() #closing the file handler.
>>> f = open('C:\\2.txt', 'r')  # Open in reading mode.
>>> for line in f.readlines(): #iterates through the file lines
print line #printing each line.

Code: [Select]
#Here is the output.	        
Hola!

Hello!

Using File Pointer !
Code: [Select]
>>>f.close() #closing the handler.

طب تمام .. هنفتح ال File مرة تانية ولكن فى ال Append mode

Code: [Select]
>>> f=open('C:\\2.txt', 'a')
>>> print >> f, 'Programming Fr34ks r0x!'
>>> print >> f, 'File pointers are',  #Note : this comma is used to avoid printing a new line.
>>> print >> f, ' so great' # added to the line 'File pointers are'
>>> f.close()


نقرا اللى مكتوب فى ال File بإننا نعمل Iteration بسيطة على ال filehandler.readlines method

Code: [Select]
>>> f=open('C:\\2.txt', 'r')
>>> for line in f.readlines():
print line

Code: [Select]
# The output 

Hola!
Hello!
Using File Pointer !
Programming Fr34ks r0x!
File pointer are  so great


« Last Edit: September 08, 2009, 08:26:36 PM by Ahmed Youssef »
Logged

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