Trang

Friday, May 29, 2015

Bài 6: Đọc và viết file trong Python

Hôm nay chúng ta sẽ được tìm hiều về đọc và xuất file trong Python. Việc thao tác với file sẽ được sử dụng rất nhiều trong khi làm việc sau này.
- Đầu tiên: Mở file
Khi mở file chúng ta sử dụng hàm với cú pháp sau:
Code:
open(filename, mode)
Thông số thứ nhất là một chuỗi chứa tên tập tin. Thông số thứ hai là một chuỗi khác chứa một vài ký tự xác định cách thức tập tin sẽ được dùng. mode có thể là 'r' khi tập sẽ chỉ được đọc, 'w' chỉ được ghi (tập tin cùng tên đang có sẽ bị xóa), và 'a' mở tập tin để thêm vào cuối; mọi dữ liệu ghi vào tập tin sẽ được tự động thêm vào cuối. 'r+' mở tập tin để đọc và ghi. Thông số mode là không bắt buộc; 'r' sẽ được giả định nếu nó bị bỏ qua.
Trong Windows và Macintosh, 'b' thêm vào mode mở tập tin ở chế độ nhị phân, cho nên cũng có các chế độ khác như 'rb', 'wb', và 'r+b'. Windows phân biệt rõ các tập tin văn bản và nhị phân; ký tự hết dòng (end-of-line) trong các tập tin văn bản được tự động thay đổi một chút khi dữ liệu được đọc hay ghi. Việc thay đổi sau bức bình phong (behind-the-scene) như vậy không ảnh hưởng các tập tin văn bản ASCII, nhưng nó sẽ phá dữ liệu nhị phân như trong các tập tin JPEG hay hàm EXE . Cần cẩn thận dùng chế độ nhị phân khi đọc và ghi các tập tin như vậy.
Ví dụ:
Code:
f=open('/home/kma/vidu.txt', 'w')
- Thứ hai: Đọc file
Để đọc file chúng ta sử dụng cú pháp sau. Giả sử chúng ta đã mở file vidu.txt như cú pháp trên:
  • Hàm sử dụng để đọc file:
    Code:
    f.read(size)
    Hàm trên đọc một số lượng dữ liệu và trả về một chuỗi. size là một thông số số nguyên không bắt buộc. Khi size bị bỏ qua hoặc âm, toàn bộ nội dung tập tin sẽ được đọc và trả về; bạn sẽ gặp vấn đề nếu tập tin lớn gấp đôi bộ nhớ của máy bạn. Ngược lại, nhiều nhất size byte sẽ được đọc và trả về. Nếu đã đến cuối tập tin, f.read() sẽ trả về một chuỗi rỗng ("").
  • Đọc 1 dòng của file:
    Code:
    f.readline()
    Ký tự dòng mới (\n) được giữ lại ở cuối chuỗi, và sẽ chỉ bị bỏ qua ở dòng cuối của tập tin nếu tập tin không kết thúc bằng một dòng mới. Điều này làm giá trị trả về rõ ràng; nếu f.readline() trả về một chuỗi rỗng có nghĩa là đã đụng cuối tập tin, trong khi một dòng trống thì được biểu diễn bởi '\n', một chuỗi chỉ chứa duy nhât một ký tự dòng mới.
  • Để di chuyển vị trí trong file:
    Code:
    f.seek(offset, from_what)
    Vị trí được tính từ tổng của offset và điểm tham chiếu; điểu tham chiếu được xác định bởi thông số from_what . Giá trị from_what0 tính từ đầu tập tin, 1 dùng vị trí hiện tại, và 2 tính từ vị trí cuối tập tin. from_what có thể bị bỏ qua và mặc định là 0, điểm tham chiếu là đầu tập tin.
  • Để biết vị trí của con trỏ trong tập tin:
    Code:
    f.tell()
    Hàm trả về một số nguyên cho biết vị trí hiện tại của đối tượng tập tin, tính theo byte từ đầu tập tin.
Nào, chúng ta sẽ tạo 1 file txt với nội dung bất kì được lưu cùng vị trí với chương trình dưới. Sau đó sẽ dùng chương trình dưới để mở file và đọc nội dung nhé:
Code:
#coding: utf-8

filename = raw_input('Nhap vao ten file can doc: ')
print "Đây là nội dung file của bạn: "
f = open(filename,'r')
print f.read()
Output:
[​IMG]​

- Thứ ba: Ghi file
Để ghi file, trước hết chúng ta cần mở file ra bằng cú pháp mở file. Sau đó sử dụng hàm sau để ghi vào file:
Code:
f.write(string)
Hàm viết nội dung của string vào tập tin, trả về None. Để viết một thứ khác không phải là chuỗi, nó sẽ cần được chuyển thành một chuỗi trước:

Code:
value = ('the answer', 42)
s = str(value)
f.write(s)
- Cuối cùng: Đóng file
Các bạn sử dụng hàm sau để đóng file:
Code:
f.close()
Ví dụ:
Code:
print "Hom nay toi se chi cho ban cach viet vao 1 file."
f = open('ghifile.txt','w+')
f.write('Day la dong dau tien\n')
s = 'Day la dong thu hai\n'
f.write(s)
s1 = raw_input('Nhap vao dong ban muon viet: ')
f.write(s1)
print "Mo file ghifile.txt ra xem ket qua nhe"
f.close()
Output:
[​IMG]
​
Bài tập:
  • Viết chương trình giải phương trình ax+b = c với a,b,c nhập từ bàn phím. Kết quả thu được lưu vào file ketqua.txt
  • Viết chương trình thực hiện một bản phỏng vấn nhỏ, kết quả phỏng vấn được lưu vào file hoso.txt. Sau đó dùng lệnh đọc file để in file hoso.txt ra màn hình.

Bài 5: Nhập dữ liệu từ bàn phím trong Python

Hôm nay chúng ta sẽ tìm hiểu cách nhập dữ liệu từ bàn phím cho biến nhé. Ở Python 2.x chúng ta sẽ sử dụng hàm sau:
Các bạn chú ý là đây là dùng cho Python 2.x nhé. Còn Python 3.x hàm được đổi tên thành "input()". Bây h chúng ta sẽ đi tìm hiểu cách hoạt động của hàm raw_input() bằng chương trình nhapdulieu.py sau đây:

Code:
print "Xin chao, rat vui duoc gap ban!"
print "Sau day toi xin phep hoi ban 1 vai thong tin co ban nhe."
print "Ban ten la gi?"
ten = raw_input()
print "Ban sinh ngay?"
ngay_sinh = int(raw_input()) #Day la phep ep kieu
dia_chi = raw_input('Ban hien tai tru quan o?')
nghe_nghiep = raw_input('Ban dang lam nghe?')
vb = "co / khong co: "
print "Ban co may vi tinh chu?"
vi_tinh = raw_input(vb)

print """
Rat cam on ban da tham gia phong van, sau day la thong tin cua ban:
Ban ten la %s, sinh ngay %d, hien tai tru quan o %s, va ban dang lam nghe %s.
Ban %s may vi tinh. """ % (ten, ngay_sinh, dia_chi, nghe_nghiep, vi_tinh)
Các bạn chú ý một số điều cần nhớ trong chương trình trên:
  • Với raw_input(), các bạn có 3 cách để yêu cầu người dùng nhập dữ liệu. Cách thứ nhất là dùng kết hợp print. Cách thứ 2 là sử dụng cặp nháy đơn, và đưa xâu và trong hàm raw_input như dạng sau: raw_input('chuoi'). Cách thứ 3 là các bạn sử dụng 1 biến string để lưu sẵn mẫu cần in.
  • Nếu muốn ép kiểu dữ liệu nhập vào, hay dữ liệu đã được gán sẵn, chúng ta sẽ sử dụng các hàm sau: int() cho kiểu dữ liệu số nguyên, float() cho kiểu dữ liệu số thực...
Sau đây là Output của chương trình trên:

Bài 5 kết thúc tại đây. Đây là bài tập về nhà của bạn:
  • Tạo một chương trình làm nhiệm vụ tính tổng trung bình điểm phẩy của một sinh viên sau đó in ra màn hình thông tin về điểm các môn, điểm tổng trung bình. Dữ liệu nhập vào là các môn: toán cao cấp, vật lý, tiếng anh, tin cơ sở. Mỗi một môn có 3 điểm: điểm hệ số 1, điểm chuyên cần, điểm kiểm tra cuối kì. Cách tính điểm cho 1 môn và điểm trung bình là:
  • Sử dụng thư viện Math (Chi tiết về thư viện xem tại đây ).Viết chương trình giải phương trình bậc 2 ax^2+bx+c = d với a, b, c, d được nhập từ bàn phím.

Bài 4: Xử lý xâu khi in với print trong Python

Hôm nay chúng ta sẽ hoàn thành nốt phần print với Python để chuẩn bị chuyển sang nhập xuất dữ liệu.
- Đầu tiên: khi bạn muốn in ra một số xâu giống nhau trên cùng một dòng, bạn sẽ phải làm thế nào? Cách đơn giản nhất có lẽ là gõ xâu đó nhiều lần :D. Nếu làm thế chắc code của bạn cũng sẽ rối tung lên và gõ rất mỏi tay. Mình sẽ bày cho các bạn cách thứ 2: Sử dụng phép * để tăng số lần in xâu. Cụ thể hơn bạn hãy tham khảo đoạn code dưới đây nhé:

Code:
print "Hello!"
print "Hom nay toi se chi cho ban cach in 1 xau nhieu lan ma ko mat thoi gian."
print "Toi se thu in ra 3 chu Tet Tet Tet nhe."
print "Tet " * 3 #Chu y doan nay nhe!
Bạn hãy thử thực hiện xem thế nào :D. Chú ý gõ tay nhé, đừng copy và paste ^^!
Output:

Thật là tiện lợi đúng không :D. Chúng ta sang tiếp vấn đề tiếp theo nhé.
- Thứ hai: Giả sử bạn có 2 xâu, bạn muốn in kết hợp hai xâu đó ra màn hình thì cần làm thế nào? Hãy xem ví dụ dưới đây để rõ hơn nhé:

Code:
kt1 = "H"
kt2 = "e"
kt3 = "l"
kt4 = "l"
kt5 = "o"
kt6 = "!"
kt7 = "Y"
kt8 = "o"
kt9 = "u"
print kt1 + kt2 + kt3 + kt4 + kt5 , #chu y dau phay nhe. hay so sanh khi thuc hien co dau phay va khong co
print kt7 + kt8 +kt9 + kt6
Output:

Như vậy, để sử dụng 2 lệnh print nhưng vẫn yêu cầu in trên 1 dòng, ta sử dụng dấu phẩy (,) ở cuối lệnh print thứ nhất. Và tiếp theo để nối các xâu lại với nhau và in ra, chúng ta sẽ dùng phép + để nối xâu nhé.
- Thứ ba: Nếu bạn muốn in 1 đoạn văn ra như 1 bài trình bày word bình thường, mà không muốn sử dụng kí tự đặc biệt (\n) để xuống dòng thì hãy sử dụng 3 cặp dấu nháy kép nhé (""" """). Cụ thể hơn, các bạn xem ví dụ ở dưới nhé:
Code:
#Day la in binh thuong nhe, chung ta su dung \n de xuong dong
days = "Mon Tue Wed Thu Fri Sat Sun"
months = "\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"
print "Here are the days: ", days
print "Here are the months: ", months

#Day la in theo kieu moi:
print """
Ban muon de dang in ra doan van
Hay su dung 3 cap dau nhay kep nhe
Nhu the nay nay.
"""
Output:
- Cuối cùng: Bạn muốn in ra 1 số kí tự đặc biệt như: ' " \ Hãy sử dụng kí tự back-slash (\) nhé. Bảng chức năng của nó ở dưới này:
Chúng ta thử làm 1 ví dụ để hiểu hơn về cách sử dụng của nó nhé:
Code:
tabby_cat = "\tLui vao 1 tab."
persian_cat = "Toi chia cau\nlam hai dong."
backslash_cat = "Toi \\ la \\ meo."
fat_cat = """
Toi se thuc hien danh sach sau:
\t* Cho meo an\n\t* Ca
\t* Tam cho\n\t* Meo
"""
print tabby_cat
print persian_cat
print backslash_cat
print fat_cat
Output:
Chắc bây h bạn đã nắm rõ cách sử dụng "\" để in ra các kí tự đặc biệt, căn lề, lùi dòng... Chúng ta sẽ kết thúc phần print và xâu ở đây. Sau đây là bài tập của các bạn:
  1. Sử dụng kiến thức trong bài vẽ hình chữ nhật sau:
    Code:
    ..................................
    .                                .
    .                                .
    .                                .
    .                                .
    ..................................
  2. Kết hợp back-slash in đoạn văn sau:

Hướng dẫn sử dụng Layout trong Qt dùng Qt designer

Trong hướng dẫn này, các bạn sẽ học cách sử dụng các Layouts trong QT. Chúng ta sẽ sử dụng designer thay vì code bằng tay.
Tạo 1 project mới :
File->New File or Project…
Applications->Qt Gui Application->Choose…
Chúng ta sẽ làm việc với QDialog.
Sau khi đặt Label, TextEdit, Spacer, and 2 PushButtons, chúng ta sử dụng Horizontal Layout ( tức layout theo chiều ngang) để sắp xếp các widgets bên dưới (bottom) của dialog.
Sau đó chúng ta cần sắp xếp các widgets còn lại là Label và TextEdit theo chiều dọc . Để làm được vấn đề này mình sẽ sử dụng Vertical Layout.
Run the code:
Chú ý rằng chúng ta có thể set các layout này trực tiếp bằng code.

Thursday, May 28, 2015

Xử lý tiếng Việt bằng Python (1)

Xử lý tiếng Việt bằng Python :
Để có thể type được tiếng Việt trong môi trường lập trình Python và save thành file .py, bạn cần phải thêm 1 thông báo vào đầu chương trình :
#!/usr/bin/python
# -*- coding: utf8 -*-
Từ bây giờ, tôi mặc định chương trình luôn có đoạn khai báo font chữ này.
Hiện tại, định dạng chữ Unicode đang được sử dụng rất phổ biến và (có lẽ) là phần lớn tiếng Việt dưới dạng số đều được xử lý dưới định dạng này. Về lịch sử và khái niệm Unicode, bạn có thể tham khảo ở đây.
Vậy là bạn đã hiểu tại sao ta lại sử dụng Unicode, và tại sao dòng thông báo trên kia lại là
# -*- coding: utf8 -*-
Ta sẽ đi vào những ví dụ và đoạn mã cụ thể để tìm hiểu Python hoạt động trên Unicode như thế nào.

1. Các hàm dựng sẵn và Unicode
Lấy 1 ví dụ đơn giản sau :
s = "Lưu Tuấn Anh"
print s, len(s)
Kết quả nhận được sẽ là :
Lưu Tuấn Anh 15
Điều này khá kì quặc khi chuỗi “Lưu Tuấn Anh” chỉ có 12 chữ cái.
Ta tiếp tục thêm vào đoạn mã sau :
for char in s:
               print char
Kết quả nhận được sẽ là :
L
�
�
u

T
u
�
�
�
n

A
n
h
Như vậy ta có thể thấy chữ “ư” được biểu diễn bằng 2 byte, chữ “ấ” được biểu diễn bằng 3 byte. Lý do cho lỗi phát sinh này là sự không tương thích về định dạng giữa chuỗi s và hàm len(s). Khi chuỗi s đưa vào hàm len(), nó sẽ được mặc định là ASCII, và 1 kí tự ASCII chỉ chiếm 1 byte.
Sửa lại ví dụ trên 1 chút :
s = u"Lưu Tuấn Anh"
print s, len(s)
Kết quả sẽ được :
Lưu Tuấn Anh 12
Chữ cái ‘u’ trước chuỗi là dạng viết tắt để Python hiểu được chuỗi s sẽ được hiển thị và thao tác dưới dạng Unicode. Như thế hàm len() cũng hoạt động 1 cách chính xác.
Khi lập trình xử lý tiếng Việt, chúng ta sẽ còn gặp lại nhiều tình huống giống như thế này. Vì thế bất cứ lúc nào, bạn cũng phải xác định được mình đang thao tác với chuỗi có định dạng gì : Unicode, ASCII, hay UTF8, …

2. Các toán tử với chuỗi :
Ta có đoạn code sau :
s = "Lưu "
t = s+u"Tuấn Anh"
print t, len(t), type(t)
Chuỗi s không được khai báo là Unicode, vì thế trong phép cộng 2 chuỗi ở lệnh tiếp theo, ta có dạng “1 chuỗi không phải Unicode” + “1 chuỗi là Unicode”.
Kết quả sẽ được :
Lưu Tuấn Anh 12 <type 'unicode'>
Ta rút ra kết luận, Python đã tự chuyển chuỗi không phải Unicode thành Unicode rồi thực hiện phép cộng, do đó chuỗi kết quả nhận được cũng dưới dạng Unicode.

Ta sẽ thử với các hàm khác trong Python :

t = "Lưu Tuấn Anh"
tt = t.split(u" ")
print tt
Kết quả sẽ khiến bạn đau đầu :
[u'L\u01b0u', u'Tu\u1ea5n', u'Anh']
Nhưng nếu chú ý kĩ, mỗi phần tử trong tt vẫn theo định dạng Unicode. Ta sẽ thêm vào đoạn mã trên 2 dòng lệnh nữa :
for tp in tt:
    print tp, len (tp)
Kết quả lúc này sẽ nhận được :
Lưu 3
Tuấn 4
Anh 3
Như thế hàm split() vẫn đảm bảo tính chính xác của chuỗi dưới dạng unicode.
Các thao tác với chuỗi khác như join, find, … cũng tương tự : khi có 1 tham số dạng Unicode thì các tham số còn lại cũng tự động chuyển sang dạng Unicode trước khi thao tác.

Tiếp tục thử với hàm upper(). Ta có đoạn mã sau :
t = "Lưu Tuấn Anh"
print t.upper()
Kết quả nhận được sẽ là :
LưU TUấN ANH
Tức là hàm upper() không tác động được lên kí tự ‘ư’ và kí tự ‘ấ’. Ta sẽ sửa lại đoạn mã trên bằng cách khai báo t dưới dạng unicode :
t = u"Lưu Tuấn Anh"
print t.upper()
Kết quả là :
LƯU TUẤN ANH
ð  Kết luận : khi thao tác trên tiếng Việt hay các chuỗi Unicode, để tránh những lỗi phát sinh không đáng có, hãy khai báo định dạng chuỗi là unicode ngay từ đầu.
Có 1 cách xử lý khác cho  vấn đề này là khai báo từ đầu chương trình : 
import sys
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
sys.stdin = codecs.getreader('utf_8')(sys.stdin)

Bài 03: Câu Lệnh (mệnh đề) if else trong python

Ở bài trước chúng ta đã biết được các kiểu dữ liệu thông dụng trong python, đồng thời chúng ta cũng đã học được hàm print dùng để in giá trị ra màn hình. Tiếp theo bài này chúng ta sẽ tìm hiểu một kiến thức mới đó là câulệnh if else và if else lồng nhau trong python.
Như ta biết mệnh đề thường sẽ trả lời các câu hỏi như "nếu đúng ... thì làm ... ", nghĩa là nếu thỏa mãn điều kiện thì làm công việc gì đó. Nếu như bạn đã học qua một số ngôn ngữ khác như PHP, C++, C# thì chúng ta có cú pháp là:
1
2
3
4
5
6
if (expression){
    //statement
}
else {
    // statement
}
Nhưng với Python thì cú pháp mệnh đề if else hoàn toàn khác, khác như thế nào thì chúng ta bắt đầu tìm hiểu nhé.

1. Cú pháp câu lệnh if else trong Python

Nguồn: http://code.freetuts.net/cau-lenh-menh-de-if-else-trong-python-197.html 
Vui lòng ghi rõ nguồn và tác giả khi copy hay chia sẻ bài này!

Cú pháp if else:

1
2
3
4
if expression:
    #statement
else :
    #statement

Cú pháp if else lồng nhau:

1
2
3
4
5
6
if expression1:
    if expression2:
        #statment
    #statment
else :
    #statment

Cú pháp Elif

Nghe Elif có vẻ hơi khác thường nhỉ cool, thông thường trong các ngôn ngữ PHP, C, C++ thì else if  chứ ko giống Python (Elif)
1
2
3
4
if expression1:
    #statement
elif expression2 :
    #statement
Như vậy trong Python ta không dùng cặp dấu ngoặc () để bao quanh điều kiện trong mệnh đề if, và ta cũng không dùng cặp dấu {} để bao quanh khối lệnh của mệnh đề if mà thay vào đó ta dùng dấu hai chấm (:) ở đầu để khai báo bắt đầu đoạn code và kết thúc không có gì cả.
Ví dụ: if else
1
2
3
4
5
bien= 100;
if bien == 100:
    print("Gia tri cua bien = 100");
else :
    print("Gia tri cua bien khac 100");
Ví dụ: if else lồng nhau
1
2
3
4
5
6
7
8
9
10
11
bien= 100;
#Cau if thu nhat
if bien == 100:
    ten = "thehalfheart";
 
    # Cau if thu hai
    if ten == "thehalfheart":
        print("Gia tri cua ten la thehalfehart");
    print("Gia tri cua bien = 100");
else :
    print("Gia tri cua bien khac 100");
Ví dụ: elif
1
2
3
4
5
bien = 101;
if bien == 100:
    print("Gia tri bien = 101");
elif bien == 101 :
    print("Gia tri cua bien khac 101");
Ta thấy lệnh if else trong python không có ký tự đánh dấu một khối, như vậy thì điểm dừng của nó ở đâu? Để trả lời ta qua phần 2 nhé.
Lưu y: Trong Python các đoạn code được hiểu là một khối nếu nó cùng một tab (thẳng hàng từ trên xuống) cho tới khi gặp tab ngắn hơn, nên nếu bạn tự ý tab vào thì trình biên dịch sẽ báo lỗi ngay.

2. Làm sao xác định kêt thúc lệnh if else trong Python

Để báo cho trình biên dịch biết đoạn code nằm ngoài một khối lệnh nào đó thì ta sẽ tap thụt ngoài 1 ô, nghĩa là trong Python các lệnh được bao khối bởi cấu trúc cây (cây nằm sâu là con của cây ngoài). Xem hình minh họa dưới đây:

Các đường màu đỏ mô phỏng các đoạn code cùng cấp trong python
Ví dụ 1: Không thụt vào 1 tab nên bị hiểu nhầm là nằm trong khối else
1
2
3
4
5
6
bien = 101;
if bien == 101:
    print("Gia tri bien = 101");
else :
    print("Gia tri cua bien khac 101");
    print("Doan code ngoai lenh if else");
Kết quả:
Ví dụ 2: Thụt vào 1 tab nên trình biên dịch hiểu dòng cuối cùng không nằm trong khối if else.
1
2
3
4
5
6
bien = 101;
if bien == 101:
    print("Gia tri bien = 101");
else :
    print("Gia tri cua bien khac 101");
print("Doan code ngoai lenh if else");
Kết quả:
if else long nhau

3. Kết luận

Tới bài này mình cảm thấy Python bắt đầu thú vị rồi đấy, các cú pháp code của nó không giống như C hay C++ mà theo một cách riêng biệt. Nếu bạn mới học lập trình thì không sao chứ bạn nào mà học qua các ngôn ngữ kia rồi thì sẽ cảm thấy Python khó chịu vì khó quản lý code. Tuy nhiên bản thân mình thấy nó rất khắt khe trong việc code, bạn không thể tự mình thụt vào (tab) mà phải tuân theo quy luật của nó.