Tải bản đầy đủ (.pdf) (11 trang)

Bài 4 xử lý file trong python

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (531.98 KB, 11 trang )

ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

BÀI 4
XỬ LÝ FILE, NHẬP XUẤT DỮ LIỆU
1. File trong Python
Các tệp được đặt tên các vị trí trên đĩa để lưu trữ thông tin liên quan. Chúng được
sử dụng để lưu trữ vĩnh viễn dữ liệu trong bộ nhớ (ví dụ: đĩa cứng).
Khi ta muốn đọc hoặc ghi vào một tập tin, trước tiên ta cần mở nó. Sau khi hồn
tất, tập tin cần được đóng lại để các tài nguyên gắn với tệp được giải phóng.
Do đó, trong Python, các thao tác trên tệp diễn ra theo thứ tự sau:


Mở tệp tin



Đọc hoặc ghi (thực hiện thao tác)



Đóng tệp

 Thao tác mở tệp
Python có một hàm open () được tích hợp sẵn để mở một tệp. Hàm này trả về một
đối tượng tệp, nó được sử dụng để đọc hoặc sửa đổi tệp cho phù hợp.
>>> f = open("test.txt")
# open file in current directory
>>> f = open("C:/Python38/README.txt") # specifying full path


Chúng ta có thể chỉ định chế độ trong khi mở tệp. Muốn đọc tệp (r), ghi (w) hay
nối thêm (a) vào tệp. Ta cũng có thể chỉ định xem muốn mở tệp ở chế độ văn bản
hay chế độ nhị phân.
Mặc định là đọc ở chế độ văn bản. Trong chế độ này, ta nhận được các chuỗi khi
đọc từ tệp.
Mặt khác, chế độ nhị phân trả về byte và đây là chế độ được sử dụng khi xử lý các
tệp khơng phải văn bản như hình ảnh hoặc tệp thực thi.

Trang

1


ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

Phương
thức

Mô tả

r

Mở tệp để đọc. (default)

w

Mở tệp để ghi. Tạo một tệp mới hoặc cắt một tệp có sẵn


x

Mở tệp mới. Nếu tệp đã tồn tại thì hoạt động khơng thành
công.

a

Mở tệp để nối vào cuối tệp mà không cắt bớt. Tạo một tệp
mới nếu nó khơng tồn tại.

t

Mở tệp ở chế độ văn bản. (default)

b

Mở tệp ở chế độ nhị phân

+

Mở tệp để cập nhật (reading and writing)

Ví dụ:
f = open("test.txt")
# equivalent to 'r' or 'rt'
f = open("test.txt",'w') # write in text mode
f = open("img.bmp",'r+b') # read and write in binary mode

Không giống như các ngôn ngữ khác, ký tự a khơng có giá trị ngun là số 97 nếu
nó khơng được mã hóa bằng ASCII (hoặc các mã hóa tương đương khác).

Hơn nữa, mã hóa mặc định phụ thuộc vào nền tảng chạy ứng dụng. Trong windows
là cp1252 nhưng utf-8 trong Linux.
Vì vậy, chúng ta cũng khơng được dựa vào bảng mã mặc định nếu không mã của
chúng ta sẽ hoạt động khác nhau trong các nền tảng khác nhau.
Do đó, khi làm việc với các tệp ở chế độ văn bản, ta nên chỉ định kiểu mã hóa.
Ví dụ:
f = open("test.txt", mode='r', encoding='utf-8')

 Thao tác đóng tệp

Trang

2


ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

Khi ta thực hiện xong các thao tác trên tệp, chúng ta cần phải đóng tệp đúng cách.
Việc đóng tệp sẽ giải phóng tài nguyên được gắn với tệp. Nó được thực hiện bằng
cách sử dụng phương thức close () có sẵn trong Python.
Python có một trình thu gom rác để dọn dẹp các đối tượng không được tham chiếu
nhưng chúng ta khơng được dựa vào nó để đóng tệp.
Ví dụ:
f = open("test.txt", encoding = 'utf-8')
# perform file operations
f.close()

Phương pháp này khơng hồn tồn an tồn. Nếu một ngoại lệ xảy ra khi ta đang

thực hiện một số thao tác với tệp, thì mã sẽ thốt mà khơng đóng tệp.
Một cách an toàn hơn là sử dụng một khối try... finally.
Ví dụ:
try:
f = open("test.txt", encoding = 'utf-8')
# perform file operations
finally:
f.close()

Bằng cách này, đảm bảo rằng tệp được đóng đúng cách ngay cả khi một ngoại lệ
được đưa ra khiến luồng chương trình dừng lại.
Cách tốt nhất để đóng tệp là sử dụng câu lệnh with. Điều này đảm bảo rằng tệp
được đóng khi khối bên trong câu lệnh with được thốt.
Chúng ta khơng cần phải gọi phương thức close() mà nó ngầm được thực hiện.
Ví dụ:
with open("test.txt", encoding = 'utf-8') as f:
# perform file operations

 Thao tác ghi ra tệp
Để ghi vào một tệp bằng Python, chúng ta cần mở nó bằng write w, ghi thêm a.

Trang

3


ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC


Chúng ta cần phải cẩn thận với chế độ w, vì nó sẽ ghi đè lên tệp nếu nó đã tồn tại.
Do đó, tất cả dữ liệu trước đó sẽ bị xóa.
Việc ghi một chuỗi hoặc chuỗi byte (đối với tệp nhị phân) được thực hiện bằng
phương thức write (). Phương thức này trả về số ký tự được ghi vào tệp.
Ví dụ:
with open("test.txt",'w',encoding = 'utf-8') as f:
f.write("my first file\n")
f.write("This file\n\n")
f.write("contains three lines\n")

Chương trình này sẽ tạo một tệp mới có tên test.txt trong thư mục hiện tại nếu nó
khơng tồn tại. Nếu nó tồn tại, nó sẽ bị ghi đè.
Ta phải có các ký tự dịng mới để phân biệt các dòng khác nhau.
 Thao tác đọc tệp
Để đọc một tệp bằng Python, ta phải mở tệp ở chế độ đọc r.
Có nhiều phương pháp khác nhau để đọc tệp. Chúng ta có thể sử dụng phương thức
read (size) để đọc số kích thước của dữ liệu. Nếu tham số kích thước khơng được
chỉ định, nó sẽ đọc và trả về kết quả đến cuối tệp.
Chúng ta có thể đọc tệp text.txt đã viết trong phần trên theo cách sau:
Ví dụ:
>>> f = open("test.txt",'r',encoding = 'utf-8')
>>> f.read(4)
# read the first 4 data
'This'
>>> f.read(4)
' is '

# read the next 4 data

>>> f.read()

# read in the rest till end of file
'my first file\nThis file\ncontains three lines\n'
>>> f.read()
''

# further reading returns empty sting

Trang

4


ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

Ta có thể thấy rằng phương thức read() trả về một dòng mới là '\ n'. Khi đến cuối
tệp, ta nhận được một chuỗi trống.
Ta có thể thay đổi vị trí con trỏ tệp hiện tại bằng cách sử dụng phương thức seek().
Tương tự, phương thức tell() trả về vị trí hiện tại (theo số byte).
Ví dụ:
>>> f.tell()
56

# get the current file position

>>> f.seek(0)
0

# bring file cursor to initial position


>>> print(f.read()) # read the entire file
This is my first file
This file
contains three lines

Ta có thể đọc từng dịng một tệp bằng vòng lặp for. Như vậy vừa hiệu quả vừa
nhanh chóng.
Ví dụ:
>>> for line in f:
...
print(line, end = '')
...
This is my first file
This file
contains three lines

Trong chương trình này, các dòng trong tệp bao gồm một ký tự sang dòng mới \ n.
Vì vậy, ta sử dụng tham số end của hàm print() để tránh hai dịng mới khi in.
Ngồi ra, chúng ta có thể sử dụng phương thức readline() để đọc các dòng riêng lẻ
của tệp. Phương thức này đọc một tệp cho đến dòng mới, chứa cả ký tự dịng mới.
Ví dụ:
>>> f.readline()
'This is my first file\n'
>>> f.readline()

Trang

5



ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

'This file\n'
>>> f.readline()
'contains three lines\n'
>>> f.readline()
''

Cuối cùng, phương thức readlines() trả về danh sách các dịng cịn lại của tồn bộ
tệp. Tất cả các phương thức đọc này trả về giá trị trống khi đến cuối tệp (EOF).
Ví dụ:
>>> f.readlines()
['This is my first file\n', 'This file\n', 'contains three lines\n']

 Các phương thức với tệp
Có nhiều phương thức khác nhau có sẵn với đối tượng tệp, một số phương thức đã
được sử dụng trong các ví dụ trên.
Dưới đây là danh sách đầy đủ các phương thức ở chế độ văn bản với mơ tả ngắn
gọn:
Phương thức

close()

Mơ tả

Đóng một tệp đã mở. Nó khơng có hiệu lực
nếu tệp đã được đóng.


detach()

Tách bộ đệm nhị phân cơ bản khỏi TextIOBase
và trả về nó.

fileno()

Trả về một số ngun (bộ mơ tả tệp) của tệp.

flush()

Làm sạch bộ đệm ghi của dòng tệp.

isatty()

Trả về True nếu luồng tệp có tính tương tác.

read( n )

Đọc nhiều nhất n ký tự từ tệp. Đọc cho đến
cuối tệp nếu nó là số âm hoặc None.

Trang

6


ĐỀ CƯƠNG BÀI GIẢNG


IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

readable()

Trả về True nếu luồng tệp có thể được đọc từ
đó.

readline( n =-1)

Đọc và trả về một dịng từ tệp. Đọc tối đa n
byte nếu được chỉ định.

readlines( n =-1)

Đọc và trả về danh sách các dòng từ tệp. Đọc
tối đa n byte / ký tự nếu được chỉ định.

seek( offset , from = SEEK_SET )

Thay đổi vị trí tệp thành offset bytes, tới from
(start, current, end).

seekable()

Trả về True nếu truy cập ngẫu nhiên vào tệp.

tell()

Trả về một số nguyên đại diện cho vị trí hiện tại
của đối tượng của tệp.


truncate( size = None )

Thay đổi kích thước tệp sang size bytes. If
size khơng xác định, thay đổi về kích thước
hiện hành.

writable()

Trả về True nếu luồng tệp được ghi vào.

write( s )

Ghi chuỗi s vào tệp và trả về số ký tự được ghi.

writelines( lines )

Ghi danh sách các lines vào tệp.

2.

Quản lý thư mục và tệp Python

Trong phần này, ta sẽ tìm hiểu về quản lý tệp và thư mục bằng Python, tức là tạo
một thư mục, đổi tên nó, liệt kê tất cả các thư mục và làm việc với chúng.


Thư mục Python

Nếu có một số lượng lớn tệp cần xử lý trong chương trình Python, ta có thể sắp xếp

mã của mình trong các thư mục khác nhau để giúp dễ quản lý hơn.
Thư mục là một tập hợp các tệp và thư mục con. Python có mô-đun hệ điều hành
cung cấp cho chúng ta nhiều phương pháp hữu ích để làm việc với các thư mục (và
cả tệp).


Nhận thư mục hiện tại

Trang

7


ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

Chúng ta có thể lấy thư mục làm việc hiện tại bằng phương thức getcwd () của môđun os.
Phương thức này trả về thư mục làm việc hiện tại dưới dạng một chuỗi. Chúng ta
cũng có thể sử dụng phương thức getcwdb () để lấy nó dưới dạng đối tượng byte.
Ví dụ:
>>> import os
>>> os.getcwd()
'C:\\Program Files\\PyScripter'
>>> os.getcwdb()
b'C:\\Program Files\\PyScripter'

Dấu gạch chéo ngược mang ý nghĩa là một chuỗi thoát khỏi thư mục. Hàm print()
sẽ hiển thị đúng như nội dung sau hàm.
Ví dụ:

>>> print(os.getcwd())
C:\Program Files\PyScripter



Thay đổi thư mục

Chúng ta có thể thay đổi thư mục làm việc hiện tại bằng cách sử dụng phương thức
chdir ().
Đường dẫn mới mà ta muốn thay đổi phải được cung cấp dưới dạng một chuỗi
trong phương thức này. Ta có thể sử dụng cả dấu gạch chéo lên / hoặc dấu gạch
chéo ngược \ để tách các phần tử đường dẫn.
Sẽ an toàn hơn khi thốt khỏi thư mục sử dụng dấu gạch chéo ngược.
Ví dụ:
>>> os.chdir('C:\\Python33')
>>> print(os.getcwd())
C:\Python33



Liệt kê các thư mục và tệp

Trang

8


ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC


Tất cả các tệp và thư mục con bên trong một thư mục có thể được truy xuất bằng
phương thức listdir ().
Phương thức này nhận một đường dẫn và trả về danh sách các thư mục con và tệp
trong đường dẫn đó. Nếu khơng có đường dẫn nào được chỉ định, nó sẽ trả về danh
sách các thư mục con và tệp từ thư mục làm việc hiện tại.
Ví dụ:
>>> print(os.getcwd())
C:\Python33
>>> os.listdir()
['DLLs',
'Doc',
'include',
'Lib',
'libs',
'LICENSE.txt',
'NEWS.txt',
'python.exe',
'pythonw.exe',
'README.txt',
'Scripts',
'tcl',
'Tools']
>>> os.listdir('G:\\')
['$RECYCLE.BIN',
'Movies',
'Music',
'Photos',
'Series',
'System Volume Information']




Tạo một thư mục mới

Chúng ta có thể tạo một thư mục mới bằng phương thức mkdir ().
Phương thức này đưa vào đường dẫn của thư mục mới. Nếu đường dẫn đầy đủ
không được chỉ định thì thư mục mới được tạo trong thư mục làm việc hiện tại.
Ví dụ:
>>> os.mkdir('test')

Trang

9


ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

>>> os.listdir()
['test']



Đổi tên Thư mục hoặc Tệp

Phương thức rename() có thể đổi tên một thư mục hoặc một tệp.
Để đổi tên bất kỳ thư mục hoặc tệp nào, phương thức rename() nhận vào hai đối số
cơ bản: tên cũ làm đối số đầu tiên và tên mới làm đối số thứ hai.

Ví dụ:
>>> os.listdir()
['test']
>>> os.rename('test','new_one')
>>> os.listdir()
['new_one']



Xóa thư mục hoặc tệp

Một tệp có thể được xóa (xóa) bằng cách sử dụng phương thức remove ().
Tương tự, phương thức rmdir () loại bỏ một thư mục trống.
Ví dụ:
>>> os.listdir()
['new_one', 'old.txt']
>>> os.remove('old.txt')
>>> os.listdir()
['new_one']
>>> os.rmdir('new_one')
>>> os.listdir()
[]

Lưu ý: Phương thức rmdir () chỉ có thể xóa các thư mục trống.
Để loại bỏ một thư mục khơng trống, chúng ta có thể sử dụng phương thức
rmtree() bên trong mơ-đun shutil.
Ví dụ:
Trang

10



ĐỀ CƯƠNG BÀI GIẢNG

IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC

>>> os.listdir()
['test']
>>> os.rmdir('test')
Traceback (most recent call last):
...
OSError: [WinError 145] The directory is not empty: 'test'
>>> import shutil
>>> shutil.rmtree('test')
>>> os.listdir()
[]

Trang

11



×