Python – File

4.9/5 - (60 votes)

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

 

2.3 3 votes
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

2 Comments
Inline Feedbacks
View all comments
hoàng
hoàng
7 năm trước

Ôi … bài này đọc khó hiểu quá anh ơi. Anh có tài liệu nào thực tế hơn 1 chút về vấn đề này không ạ.
Kiểu như nó ứng dụng vào việc gì hay nó dùng để làm gì đó ạ ….