Trong phần này chúng ta sẽ tìm hiểu về cách đọc ghi file trong Python.
Hệ thống nhập xuất chuẩn
Trong Python có 3 luồng nhập xuất là luồng input, luồng output và luồng error. Luồng input là luồng nhập, tất cả các dữ liệu đi vào chương trình đều đi qua đường này, luồng này mặc định được kết nối giữa chương trình với bàn phím. Luồng output là luồng xuất, làm nhiệm vụ đưa dữ liệu ra ngoài, mặc định gắn với màn hình console (trên Windows là cmd – Command Prompt, trên Linux là Terminal). Luồng error là luồng báo lỗi, luồng này đưa các thông báo lỗi ra ngoài, mặc định cũng gắn với màn hình console.
Luồng input
Đây là dòng dữ liệu đi vào chương trình.
import sys print ('Enter your name: ',) name = '' while True: c = sys.stdin.read(1) if c == '\n': break name = name + c print ('Your name is:', name)
Để làm việc với dòng nhập xuất thì chúng ta phải import module sys
. Trong module này có đối tượng
stdin
với phương thức read(),
phương thức này đọc các kí tự trong luồng nhập. Trong ví dụ trên, chúng ta in ra dòng chữ “Enter your name:”, sau đó cho một vòng lặp chạy, mỗi lần lặp chúng ta gọi phương thức read()
trên để đọc từng kí tự vào từ luồng nhập và kiểm tra nếu kí tự vào là kí tự Enter thì thoát vòng lặp. Kí tự enter có kí hiệu là \n
.
Enter your name: Jan Your name is: Jan
Ngoài phương thức read()
ra còn có các hàm làm nhiệm vụ tương tự là input()
và raw_input()
.
Hàm input()
in ra dòng thông báo, đọc dữ liệu vào và đánh giá dữ liệu.
data = input('Enter expression: ') print ('You have entered:', data)
Enter expression: 3*3 You have entered: 9
Hàm raw_input()
cũng tương tự như hàm input()
.
Luồng output
Luồng output là luồng dữ liệu đi ra khỏi chương trình.
import sys sys.stdout.write('Honore de Balzac, Father Goriot\n') sys.stdout.write('Honore de Balzac, Lost Illusions\n')
Trong ví dụ trên, chúng ta in các đoạn text ra màn hình bằng phương thức write()
.
Honore de Balzac, Father Goriot Honore de Balzac, Lost Illusions
Hàm print()
mà chúng ta dùng lâu nay thực chất là nó gọi tới phương thức write()
của đối tượng stdout
.
print ('Honore de Balzac, The Splendors and Miseries of Courtesans') print ('Honore de Balzac, Gobseck')
Chuyển hướng luồng nhập xuất vào file
Như đã nói ở đầu bài, luồng nhập xuất mặc định được gắn với màn hình và bàn phím. Tuy nhiên chúng ta có thể chuyển hướng chúng để làm việc với file.
import sys f = open('output.txt', 'w') sys.stdout = f print ('Lucien') sys.stdout.write('Rastignac\n') sys.stdout.writelines(['Camusot\n', 'Collin\n']) sys.stdout = sys.__stdout__ print ('Bianchon') sys.stdout.write('Lambert\n')
Trong đoạn code trên, chúng ta chuyển hướng stdout từ màn hình sang file.
Bianchon Lambert
Lucien Rastignac Camusot Collin
Hàm open
Hàm open()
được dùng để mở file trong hệ thống.
open(filename, [mode='r'], [bufsize])
Hàm này nhận ba tham số đầu vào, tham số thứ nhất là tên file, tham số thứ 2 là chế độ mở, tham số thứ 3 là kích thước bộ đệm. Chế độ mở file ở đây chỉ định cách mà file được mở. Có các chế độ như mở để đọc, ghi, ghi đè… Tham số bộ đệm là tham số tùy chọn, tức là bạn không cần đưa tham số này vào, nhưng thường thì bạn cũng không cần quan tâm đến tham số này làm gì.
Dưới đây là danh sách các chế độ mở file:
Mode | Meaning |
---|---|
r | Đọc dữ liệu kiểu text |
rb | Đọc dữ liệu kiểu nhị phân |
w | Ghi dữ liệu kiểu text |
wb | Ghi dữ liệu nhị phân |
a | Ghi thêm vào cuối file |
+ | Ghi đè |
Đoạn code đưới dây đọc nội dung một file.
f = open('ifyouwantme', 'r') for line in f: print (line,) f.close()
Chúng ta mở file ở chế độ đọc. Sau đó duyệt qua toàn bộ nội dung file bằng vòng lặp for. Cuối cùng chúng ta đóng file này lại.
Are you really here or am I dreaming I can't tell dreams from truth for it's been so long since I have seen you I can hardly remember your face anymore When I get really lonely and the distance causes our silence I think of you smiling with pride in your eyes a lover that sighs ...
Trong ví dụ dưới đây, chúng ta cũng đọc file nhưng dùng phương thức readline()
.
f = open('ifyouwantme', 'r') while True: line = f.readline() if not line: break else: print (line,) f.close()
Ngoài ra chúng ta có phương thức readlines()
(có thêm chữ s sau readline
),
phương thức này sử dụng đơn giản vì mỗi lần gọi, phương thức này đọc toàn bộ nội dung file vào bộ nhớ, cũng vì thế nên chúng ta nên hạn chế sử dụng phương thức này với các file có kích thước lớn.
f = open('ifyouwantme', 'r') contents = f.readlines() for i in contents: print (i,) f.close()
Trong ví dụ tiếp theo, chúng ta sẽ ghi nội dung vào file.
text = """Incompatible, it don't matter though 'cos someone's bound to hear my cry Speak out if you do You're not easy to find\n""" f = open('strophe.txt', 'w') f.write(text) f.close()
Để ghi file thì chỉ đơn giản là mở file ở chế độ w
, sau đó dùng phương thức write()
để ghi, nếu file đã tồn tại thì nội dung file sẽ bị ghi đè.
Incompatible, it don't matter though 'cos someone's bound to hear my cry Speak out if you do You're not easy to find
Module pickle
Bây giờ chúng ta sẽ đọc và ghi file theo kiểu dữ liệu nhị phân, ví dụ về các dạng dữ liệu nhị phân là hình ảnh, nhạc, phim… ngay cả các đoạn text thông thường cũng có cách để ghi theo kiểu nhị phân. Trong ví dụ dưới đây, chúng ta sẽ ghi dữ liệu của một đối tượng vào file. Để ghi dữ liệu dạng nhị phân thì chúng ta dùng tới module pickle
. Khi ghi lên file, pickle sẽ chuyển các đoạn text thành các dạng kí hiệu, khi đọc, nó sẽ chuyển ngược lại về text cho chúng ta.
import pickle class Person: def __init__(self, name, age): self.name = name self.age = age def getName(self): return self.name def getAge(self): return self.age person = Person('Monica', 15) print (person.getName()) print (person.getAge()) f = open('monica', 'wb') pickle.dump(person, f) f.close() f = open('monica', 'r') monica = pickle.load(f) f.close() print (monica.getName()) print (monica.getAge())
Trong đoạn code trên, chúng ta định nghĩa lớp Person và tạo một đối tượng với lớp này. Sau đó chúng ta ghi dữ liệu của đối tượng này vao file bằng phương thức dump()
. Để đọc dữ liệu nhị phân thì chúng ta dùng phương thức load()
.
Monica 15 Monica 15
monica: ASCII text