Friday, August 24, 2012

Python : Replace ข้อมูลในไฟล์แบบตามสั่ง



       เจ้างูน้อยน่ารักในชื่อ Python นี้หลายคนคงสงสัยนะครับว่ามันเป็นโปรแกรมภาษาแบบไหน มันดีอย่างไร มันคืออะไร เอาเป็นว่าไปศึกษาที่นี่เลย Python.org ไม่ขอบอกในที่นี้ แต่บอกใบ้ให้นิดๆว่า Google ที่เราใช้กันประจำๆ ก็เกิดมาจาก Python นี่หล่ะครับ

        สำหรับบทความนี้ผมสมมติเหตุการณ์ว่าผมมีไฟล์ข้อมูลไฟล์หนึ่ง เป็นไฟล์ประเภทหนึ่ง อยากที่จะเปลี่ยนข้อมูลในไฟล์นั้น ซึ่งข้อมูลที่จะต้องเปลี่ยนนั้นมีหลายรายการมากเลยทีเดียว หากผมต้องเปลี่ยนแปลงข้อมูลดังกล่าวผมมีตัวเลือกดังนี้


1. ใช้วิธีแบบทั่วไปคือ เปิดไฟล์ข้อมูลนั้นแล้วก็นั่งหาตำแหน่งข้อมูลชุดนั้นแล้วก็แก้มันซะ
ข้อดี : ไม่มี
ข้อเสีย : วิธีนี้ต้องใช้เวลานานมากและอาจแก้ไขไม่ครบสมบรูณ์เพราะเราอาจเผลอมองข้ามตำแหน่งใดๆไป หรือ พิมพ์ผิดก็เป็นได้ และบางครั้งไฟล์ข้อมูลที่เราต้องการเปลี่ยนแปลงนั้นอาจเปิดด้วยวิธีปกติไม่ได้

2. ใช้วิธีแปลงข้อมูลเป็นไบนารี่แล้วถอดมาแก้ไข โอ้ววววววว...เมพ
ข้อดึ : ตามฉบับไบนารี่ข้อมูลที่ถูกถอดออกมาจะกระจางแจ้งแดงแจ๋ จะดูส่วนไหน แก้ไขส่วนไหนละเอาเลย ไม่ว่าไฟล์ประเภทไหนอย่างไร รู้หมด
ข้อเสีย : ยุ่งยากแน่ๆหากข้อมูลที่เราต้องการเปลี่ยนแปลงมันซับซ้อนเราต้องมานั่งหาอินเด็กไฟล์ หาตำแหน่งที่ถูกต้อง อีกยังต้องมานั่งเทียบ Hash ไฟล์อีก ไม่นะ..

3. ใช้คำสั่งในโปรแกรมภาษาต่างๆแก้ไข
ข้อดี : แน่นอนเมื่อเป็นชุดคำสั่งในโปรแกรม เราสามารถที่จะควบคุมมันได้ ให้ทำตามสั่งได้ ไร้ปัญหาแน่นอน แม้แต่ข้อมูลเข้ารหัสยังยากที่จะต่อกร(หากเรารู้ถึงคีย์ของมัน อิอิ)
ข้อเสีย : ตามธรรมดาของภาษาโปรแกรมที่จะต้องพูดถึงเรื่องประสิทธิภาพการทำงาน และการใช้งาน เช่น ภาษานู้นทำไวกว่า ภาษานี้เขียนง่ายกว่า ภาษานั้นสั้นกว่า

       ผมเลือก ตัวเลือกที่ 3 เป็นคำตอบสุดท้ายครับ ทำไมหล่ะ ก็ข้อข้างบนอธิบายไว้หมด มันคงยังไม่ต้องถึงกับใช้ไบนารี่หรอกมั้ง ฮ่าๆๆๆ แล้วผมจะเลือกใช้ภาษาโปรแกรมใดหล่ะ ... ในที่นี้ผมตอบแบบไม่ต้องคิดว่า ใช้ Python สิจอร์จ เพราะใช้แล้วเครื่องฟิต สตาร์ทติดง่าย!! .. ไม่ใช่ เพราะว่ามันทำงานได้เนียนที่สุดในบรรดาภาษาทั้งหลายแหล่ที่ผมพอจะสัมผัสมา เนียน... ไม่ใช่ดีที่สุด แต่ มันเข้าใจง่าย ทำง่าย คนไม่รู้ภาษาทางโปรแกรมก็ทำได้ หากเข้าใจในจิตวิญญาณของมัน สำหรับผม Python เป็นสิ่งที่ท้าทายที่สุดในชีวิต ที่เมื่อคุณลองแล้วจะติดเหมือนยาเสพย์ติดกันเลยทีเดียว ผมรู้จักมันมา สิบกว่าปี(ตั้งแต่ พ.ศ.2539) จนถึงทุกวันนี้ผมยังไม่รู้จักมันทั้งหมดเลย ฮ่าๆๆๆ ฟังผมโม้มาซะนานเรามาเริ่มลองทำกันดูเลยนะครับ




       อุปกรณ์จำเป็นที่ต้องใช้

1.คอมพิวเตอร์ สำหรับผมต้องระบบปฏิบัติการ Ubuntu เท่านั้น (ใช้ระบบปฏิบัติการอื่นก็ได้ไม่ว่ากัน ฮ่าๆๆ) อ่ออย่าลืมติดตั้ง Python ด้วยนะ
2.ไฟล์ข้อมูลที่เราต้องการแก้ไข ในที่นี้ผมใช้ไฟล์ calendar_2.php จากตัวอย่าง PHP : มาสร้างปฏิทินกันเถอะ (ตอนที่ 2)  หากินกับงานตัวเองทางอ้อม อิอิ
3.โปรแกรม Text Editor ต่างๆ อาธิเช่น Word, Notepad, Gedit เป็นต้น

       เริ่มแรกก็เปิดโปรแกรม Text Editor ที่เราถนัดมา จากนั้นคัดลอกโค้ดนี่ไปวางไว้ซะ เดี๋ยวเรามาอธิบายกันทีหลัง

ไฟล์ try_replace.py

#! /usr/bin/python3.2
fileDir="/var/www/webmon1/"
fileRead="calendar/calendar_2.php"
fileNew="calendar/calendar_2_New.php"
reps = {'<':'&lt;', '>':'&gt;'}

def replace_all(text, dic):
 for i, j in dic.iteritems():
  text = text.replace(i, j)
     return text

readText=open(fileDir+fileRead,"rt")
txtread=readText.read()
readText.close()

txt = replace_all(txtread, reps)
#print(txt)

writeT=open(fileDir+fileNew,"wt")
writeT.write(txt)
writeT.close()
print("\n\nWrite Done!!\nWrote file at : "+fileDir+fileNew+"\n\n")

       จากนั้นก็บันทึกใช้ชื่ออะไรก็ได้แต่ต้องเป็นนามสกุล .py ตามตัวอย่างผมบันทึกไว้ที่ /home/somkiat/Documents/py/ ชื่อว่า try_replace.py



ส่วนไฟล์ข้อมูลผมได้บันทึกไว้ที่ /var/www/webmon1/calendar/ ชื่อว่า calendar_2.php

อธิบายไฟล์ try_replace.py

การทำงานในส่วนนี้นั้นมีขั้นตอนอยู่ 3 ขั้นตอนนะครับคือ

1. เปิดไฟล์ที่ต้องการแก้ไขข้อมูล
2. ทำการแก้ไขข้อมูล
3. บันทึกไฟล์ที่แก้ไขแล้วเป็นไฟล์ใหม่

       สำหรับสิ่งที่คุณต้องแก้ไขเป็นลำดับแรกในโค้ดด้านบนก็คือเปลี่ยนค่าของตัวแปรที่เก็บตำแหน่งไฟล์และไดเรกทอรี่ของเราโดย
       ผมให้ตัวแปร fileDir เก็บตำแหน่งที่อยู่ไดเรกทอรี่ดังนี้

fileDir="/var/www/webmon1/"
       ตัวแปร fileRead ใช้เก็บไฟล์ที่เราต้องการแก้ไขข้อมูล

fileRead="calendar/calendar_2.php"

       ส่วนตัวแปร fileNew ใช้สำหรับเก็บไฟล์ข้อมูลที่แก้ไขแล้วนั่นเอง

fileNew="calendar/calendar_2_New.php"

       สำหรับการเปลี่ยนแปลงข้อมูล ผมจะเก็บไว้ในตัวแปร reps เป็นตัวแปรชนิดดิกชันนารี่ สำหรับเก็บค่าว่าเราต้องการเปลี่ยนจากข้อมูลใด เป็น แบบใด เช่นผมต้องการเปลี่ยนข้อมูล สองชุดด้วยกันคือ จากข้อมูล "<" ให้เป็น "&lt;" และ ">" ให้เป็น "&gt;" ผมจะกำหนดลงไปดังนี้

reps = {'<':'&lt;', '>':'&gt;'}

       ต่อไปผมก็เริ่มประกาศฟังก์ชั่นที่ใช้สำหรับการเปลี่ยนแปลงข้อมูลซึ่ง ผมใช้ชื่อว่า replace_all() โดยรับตัวแปรมา 2 ค่าด้วยกัน ให้ชื่อตัวแปรที่รับว่า text และ dic โดย text คือข้อมูลเดิมของเรา และ dic คือข้อมูลจากตัวแปรดิกชันนารี่ซึ่ง การทำงานของฟังก์ชั่นนี้คือ รับไฟล์ข้อมูลที่จะแก้ไข และรับค่าข้อมูลที่ต้องการแก้มา จากนั้นก็เข้าถึงข้อมูลเดิมชุดนั้นแล้วแก้ไขตามจำนวนที่มีในตัวแปรดิกชันนารี่ โดยวนเข้าไปแก้ไขจนครบจำนวนข้อมูลที่ต้องแก้ไข จากนั้นจึงคืนค่าออกมาเป็นข้อมูลใหม่ที่แก้ไขแล้ว

def replace_all(text, dic):
 for i, j in dic.iteritems():
  text = text.replace(i, j)
     return text

       ฟังก์ชันที่อธิบายไปเมื่อสักครู่นี้ยังไม่ถูกใช้งานจนกว่าเราจะเรียกใช้มันนะครับ
       เมื่อเราเตรียมฟังก์ชันที่ต้องการแล้วเราก็มาเตรียมไฟล์ข้อมูลที่เราจะทำงานกันโดยการเปิดไฟล์ที่ต้องการ แล้วเก็บไว้ในตัวแปร txtread นะครับ

readText=open(fileDir+fileRead,"rt")
txtread=readText.read()
readText.close()

       จากนั้นก็ทำการแก้ไขข้อมูลโดยสั่งให้ฟังก์ชันที่แล้วของเราทำงาน

txt = replace_all(txtread, reps)

       สำหรับโค้ด ที่ผมใส่ # ไว้นี้นั้นเป็นการแสดงผลการทำงานตามคำสั่งแก้ไขข้อมูลนะครับ อยากดูเลยก็เอาเครื่องหมาย # ออกนะ

#print(txt)

       เมื่อแก้ไขเสร็จแล้วผมก็ทำการบันทึกเป็นไฟล์ใหม่ ดังนี้

writeT=open(fileDir+fileNew,"wt")
writeT.write(txt)
writeT.close()

       จากนั้นก็แสดงผลให้เห็นกันซะหน่อยว่าทำงานเสร็จแล้ว (แสดงผลเฉยๆโดยไม่ได้ตรวจสอบว่ามันทำงานสมบรูณ์แล้วจริงๆหรือปล่าวนะครับ)

print("\n\nWrite Done!!\nWrote file at : "+fileDir+fileNew+"\n\n")


       เมื่อโค้ดพร้อมเสร็จสรรพเราก็เริ่มลุยกันต่อเลย เปิด Terminal ขึ้นมา แล้วพิมพ์เข้าหาตำแหน่งไดเรกทอรี่ที่เก็บไฟล์ try_replace.py ของเรา จากนั้นพิมพ์ดังนี้

$ python ./try_replace.py

เราก็จะได้ผลลัพท์เป็นหน้าตาดังนี้



        ลองทดสอบเปิดดูที่ไฟล์เดิมนะครับว่าเนื้อหาภายในนั้นเป็นแบบไหน และลองเปรียบเทียบกับไฟล์ใหม่ที่เราเพิ่งได้ทำไปว่าเป็นอย่างไร
        ผมลองใช้คำสั่ง cat ไฟล์ทั้งสองดูและบันทึกเป็นภาพเปรียบเทียบใด้ดูนะครับ สิ่งที่เราต้องการเปลี่ยนในข้อมูลไฟล์เดิม ก็จะได้หน้าตาประมาณนี้

ไฟล์เดิม calendar_2.php



ไฟล์ใหม่ calendar_2_New.php จะเห็นว่าเครื่องหมาย "<",">" ถูกแทนที่ด้วย "&lt;","&gt;" ตามลำดับ




ลองนำไปประยุกต์ใช้กันนะครับ คุณก็ทำได้เอง ง่ายๆ







Credit : http://en.wikibooks.org/wiki/Non-Programmer's_Tutorial_for_Python_3/File_IO

Ref_Pic : http://silentleges.com/images/logos/python-logo.png

No comments:

Post a Comment