هنتكلم فى الفصل دا عن التعامل مع ال 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 (بيتم النقل لنظام التشغيل)
لغلق ال file object
بتقوم بقراءة عدد معين من البايتات وفى حال عدم تحديده بيتم قراءة الملف بكامله
قراءة سطر واحد
قراءة كل السطور (على صورة list)
بتخبرنا بالمكان الحالى
بتنقل المكان الحالى الى offset معين بعد ال whence
whence ربما تكون 0 (اى بداية الملف ) او1 (المكان الحالى) او 2 (نهاية الملف)
عندنا ملف سميناه iotest.xcd فيه التالى 0123456789
يقوم بكتابة s فى الملف
.writelines(seq_of_strings)
يقوم بكتابه كل عناصر seq_of_strings فى الملف
--كقيامك بإستدعاء write على كل عنصر فى هذه ال sequence
الحصول على File Descriptor خاص بال file
لتأكيد نقل الbuffer الداخلى كله على الملف
للحصول على مسار الملف
للحصول على ال access mode
للحصول على الإنكودينج
للتحقق من تحقق اغلاق المسار
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
الناتج
القراءة
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)
striky@striky-desktop:~$ python myecho.py hello world 123 "78 yay"
Number of arguments: 5
myecho.py
hello
world
123
78 yay
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
ضيفهم كالتالى
import os
import os.path as op
بتعيد tuple مكونة من (sysname, nodename, release, version, machine)
print os.uname()
#('Linux', 'striky-desktop', '2.6.24-21-generic', '#1 SMP Tue Oct 21 23:43:45 UTC 2008', 'i686')
بتعيد المسار الحالى
print os.getcwd()
/home/striky/workspace/pytut/src
مثل سابقتها ولكن بتعمل ريترن ب unicode
هى dictionary مخزن فيه متغير البيئة environment مثل ال HOME, LOGNAME, PATH,.. etc
للإطلاع عليهم
for key, val in os.environ.items():
print key, " => ", val
للحصول على مفتاح بعينه
للخصول على قيمة مفتاح ما فى الenviron
ال default سيتم اعادتها فى حالة عدم وجود المفتاح
انا root ?
def isroot():
return os.getenv("USER")=="root"
طبعا تقدر تستخدم ال keys, values methods الخاصة بال environ dictionary.
إضافة key لل environment بقيمة value
حذف key ما
بتقوم بنقل المسار الحالى cwd الى to
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
بتقوم بإعادة list من مكونات ال path
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']
بتنشئ hard link من src الى dest
بتنشئ symbolic link من src إلى dest
حذف path
مثل os.unlink
لحذف مجلد معين
اعادة التسمية
بتقوم بالحذف من اسفل لأعلى مثلا
os.removedirs('foo/bar/baz')
ستقوم بحذف مجلد baz اولا ثم bar ثم foo
بتقوم بتعديل ال mode على path
تحديد ال uid, gid على path معين
الفاصل العناصر المسار
المجلد الحالى وهى ال ".”
حرف فاصل بديل
المجلد الأب وهى ال "..”
الفاصل للإمتدادات وهو ال ".”
الفاصل فى متغير ال PATH وهنا:
print repr(os.linesep)#\n
الفاصل بين السطور وهنا هو ال "\n”
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")
الناتج
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')
هل المسار موجود ؟
هل ال path ملف؟
هل ال path مجلد؟
هل ال path عبارة عن link ؟
هل هو عبارة عن نقطة ضم ؟
هل هو المسار بالكامل ؟
القاعدة فى المسار
المسار المطلق
اسم المجلد
الحصول على توقيت ال last access
الحصول على توقيت ال last modification
الحصول على توقيت ال last change او ال last creation اذا كان على windows
الحصول على مساحة path
لدمج مكونات الpath بإستخدام الفاصل المناسب
تقوم بإعادة tuple مكونة من ال dirname وال basename
تقوم بإعادة tuple مكونة من ال drive, وباقى المسار
تقوم بإعادة tuple مكونة من المسار كامل بدون الإمتداد و الإمتداد
File Pointer
يمكن تكون مليت من إستخدام FileHandler.write
>>>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
على فرض إنك هتعمل File ودا معناه إنك هتستخدم ال w' permission'
>>> 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.
#Here is the output.
Hola!
Hello!
Using File Pointer !
>>>f.close() #closing the handler.
طب تمام .. هنفتح ال File مرة تانية ولكن فى ال Append mode
>>> 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
>>> f=open('C:\\2.txt', 'r')
>>> for line in f.readlines():
print line
# The output
Hola!
Hello!
Using File Pointer !
Programming Fr34ks r0x!
File pointer are so great