Bai 9
Bai 9
Bai 9
1
Chuyển đổi kiểu dữ liệu trong Python
Hàm Miêu tả
int(x [,base]) Chuyển x thành số nguyên, base xđịnh cơ sở nếu x là một
chuỗi
long(x [,base] ) Chuyển đổi x thành một long int, base xác định cơ sở nếu x
là một chuỗi
float(x) Chuyển đổi x thành một số thực
complex(real [,imag]) Chuyển đổi x thành một số phức
str(x) Chuyển đổi x thành một chuỗi
repr(x) Chuyển đổi đối tượng x thành một chuỗi biểu thức
eval(str) Ước lượng một chuỗi và trả về một đối tượng
tuple(s) Chuyển đổi s thành một Tuple
list(s) Chuyển đổi s thành một List
set(s) Chuyển đổi s thành một Set
dict(d) Tạo một Dictionary. Tham số d phải là một dãy các Tuple
của cặp (key, value)
frozenset(s) Chuyển đổi s thành một Fronzen Set
Chuyển đổi kiểu dữ liệu trong Python
Hàm Miêu tả
chr(x) Chuyển đổi một số nguyên thành một ký tự
unichr(x) Chuyển đổi một số nguyên thành một ký tự Unicode
ord(x) Chuyển đổi một ký tự đơn thành giá trị nguyên của nó
hex(x) Chuyển đổi một số nguyên thành một chuỗi thập lục phân
oct(x) Chuyển đổi một số nguyên thành một chuỗi bát phân
Nội dung
1. Quan điểm xử lý tập tin của Python
2. Đóng/Mở tập tin
3. Đọc/Ghi dữ liệu của tập tin
4. Con trỏ tập tin
5. Làm việc với hệ thống thư mục
6. Bài tập
4
1. Xử lý tập tin của Python
Quan điểm xử lý tập tin của Python
7
2. Đóng/Mở tập tin
Làm việc với nội dung tập tin
❖Làm việc với nội dung tập tin trong python gồm 3 bước:
1. Mở tập tin: Đây là bước yêu cầu hệ thống chuẩn bị các
điều kiện cần thiết để đọc/ghi nội dung tập tin bao
gồm định vị dữ liệu trên vùng lưu trữ và khởi tạo các
vùng đệm
2. Làm việc với tập tin: Bước chính của quá trình, trong
bước này chương trình thực hiện các thao tác liên
quan đến nội dung tập tin
3. Đóng tập tin: Đảm bảo nội dung mới được cập nhật
lên vùng lưu trữ và giải phóng các tài nguyên đã được
cấp phát để làm việc với tập tin
❖Các bước này đều có thể phát sinh ngoại lệ IOError
❖Đây là 3 bước chung của mọi ngôn ngữ lập trình khi làm
việc với tập tin, không phải của riêng Python
9
Mở file
❖ Thao tác mở file khá chậm, vì thực hiện những bước sau:
➢ Kiểm tra người dùng có mở quá nhiều file không
➢ Kiểm tra file có tồn tại trên hệ thống hay không
➢ Kiểm tra chương trình có quyền truy cập nội dung hay
không
➢ Kiểm tra có thể thao tác file vào thời điểm hiện tại hay
không
▪ File có thể bị khóa bởi chương trình khác
▪ File có thể chỉ đọc vì được ghi trên thiết bị cấm ghi
▪ File có thể chỉ ghi vì nó là loại thiết bị cấm đọc
➢ Định vị vùng dữ liệu file trên thiết bị lưu trữ
➢ Chuẩn bị vùng đệm cho việc đọc/ghi dữ liệu
❖ Vì vậy chỉ mở file khi cần thiết
❖ Chọn cách mở file phù hợp với mục đích xử lý
10
Mở file: f = open(filename, mode)
Giá trị Ý nghĩa
r Mở tập tin văn bản chỉ để đọc
r+ Mở tập tin văn bản để đọc và ghi
rb Mở tập tin nhị phân chỉ để đọc
rb+, r+b Mở tập tin nhị phân để đọc và ghi
w Mở tập tin văn bản để ghi, nếu tập tin không tồn tại thì sẽ tạo mới
Mở tập tin văn bản để đọc và ghi, nếu tập tin không tồn tại thì sẽ tạo
w+
mới
wb Mở tập tin nhị phân để ghi, nếu tập tin không tồn tại thì sẽ tạo mới
Mở tập tin nhị phân để đọc và ghi, nếu tập tin không tồn tại thì sẽ tạo
wb+, w+b
mới
Mở tập tin văn bản để ghi tiếp vào cuối nếu tập tin đã tồn tại, nếu tập
a
tin không tồn tại thì sẽ tạo mới
11
Mở file: f = open(filename, mode)
Giá trị Ý nghĩa
Mở tập tin văn bản để đọc và ghi tiếp vào cuối nếu tập tin đã tồn tại,
a+
nếu tập tin không tồn tại thì sẽ tạo mới
Mở tập tin nhị phân để ghi tiếp vào cuối nếu tập tin đã tồn tại, nếu tập
ab
tin không tồn tại thì sẽ tạo mới
Mở tập tin nhị phân để đọc và ghi tiếp vào cuối nếu tập tin đã tồn tại,
ab+, a+b
nếu tập tin không tồn tại thì sẽ tạo mới
x Tạo tập tin văn bản mới để ghi, sinh lỗi nếu tập tin đã tồn tại
x+ Tạo tập tin văn bản mới để đọc và ghi, sinh lỗi nếu tập tin đã tồn tại
xb Tạo tập tin nhị phân mới để ghi, sinh lỗi nếu tập tin đã tồn tại
xb+, x+b Tạo tập tin nhị phân mới để đọc và ghi, sinh lỗi nếu tập tin đã tồn tại
b Mở tập tin nhị phân để đọc
Mở tập tin văn bản để đọc (đây là giá trị mặc định của mode khi gọi
t
hàm open)
12
Ví dụ về mở file
14
Đóng file: f.close()
❖Cách làm đúng nhất là đóng file trong khối finally:
try:
# mở tập tin
f = open("test.txt", encoding = 'utf-8')
# thực hiện các thao tác với tệp
...
finally:
# đóng tập tin
f.close()
❖Chú ý: ngay cả lệnh đóng file cũng có thể sinh ngoại lệ,
trong trường hợp này ngoại lệ sẽ được trả về khối try bên
ngoài
15
3. Đọc/Ghi dữ liệu của tập
tin
Các hàm đọc file
❖read(N): đọc N byte tiếp theo
➢Nếu không viết N thì đọc đến cuối file
➢Nếu dữ liệu trong file không đủ N byte thì đọc đến cuối
file
➢Nếu tập tin mở ở chế độ văn bản thì trả về str
➢Nếu tập tin mở ở chế độ nhị phân thì trả về dãy byte
❖readline(N): đọc một dòng từ file, tối đa là N byte, nếu
không viết N thì trả về str là dữ liệu được đọc tới khi nào
gặp kí tự hết dòng hoặc hết file
➢Dữ liệu trả về bao gồm cả kí tự xuống dòng \n, trừ tình
huống đọc dòng cuối cùng của file
17
Các hàm đọc file
❖ readlines(): sử dụng readline đọc các dòng cho đến hết
file và trả về một danh sách các string,
❖ readlines(N): đọc các dòng, xử lý tối đa là N byte
❖ Các lập trình viên Python có cách đọc mọi dòng của file
đơn giản hơn rất nhiều:
for line in open("test.txt", encoding = 'utf-8'):
# thực hiện các thao tác với từng dòng
...
❖Như vậy file văn bản trong Python là một kiểu tuần tự
❖Đoạn mã trên có thể ghép cùng với phát biểu with:
with open('workfile') as f:
for line in f:
print(line, end='')
18
Các hàm ghi dữ liệu ra file
❖write(data): ghi data ra file, trả về số byte ghi được
➢Phương thức làm việc với cả file văn bản và file nhị
phân
➢Nếu file văn bản thì data phải là kiểu str
➢Nếu file nhị phân thì data phải là khối byte (kiểu
bytearray hoặc kiểu bytes)
❖writelines(data): ghi toàn bộ nội dung data vào file theo
từng dòng
➢Chỉ làm việc với kiểu file văn bản
➢Dữ liệu data phải là danh sách các str
➢Nếu cố dùng kiểu dữ liệu khác sẽ phát sinh lỗi
TypeError
19
Mở file văn bản để ghi dữ liệu
❖ Khai báo biến file
<biến file> = open(<tên file>,'w’)
▪ Khi thực hiện lệnh này, chương trình sẽ tạo ra 1
file văn bản với tên tương ứng để ghi dữ liệu
vào.
▪ Trong trường hợp file đã tồn tại thì dữ liệu cũ sẽ
bị xóa hết.
▪ Tên file có thể bao gồm cả đường dẫn.
▪ Ví dụ:
f1 = open("vidu.txt", 'w’)
f2 = open(“C:/Python/vidu.txt", 'w')
Mở file văn bản để ghi dữ liệu
❖ Ghi dữ liệu vào file: Câu lệnh write()
<biến file>.write(<chuỗi ki tự>)
▪ Ghi một chuỗi ki tự vào file
▪ Ví dụ:
f = open("vidu.txt", 'w')
f.write("Chao cac ban!\n")
f.write("Den voi Lap trinh Python.\n")
f.write("Lap trinh Python ")
f.write("rat thu vi va bo ich!")
f.close()
Mở file văn bản để ghi dữ liệu
▪ <biến file>.writelines(<một đối tượng>)
▪ Ví dụ:
f2 = open("vidu2.txt", 'w')
f2.writelines("Vi du ghi List vao file: ")
List = ['a', 'b', 'c']
f2.writelines(List)
for x in List:
f2.write('\n'+x)
f2.close()
Mở file văn bản để ghi dữ liệu
▪ Câu lệnh sai:
for i in range(5):
f.write(i)
▪ Câu lệnh đúng:
for i in range(5):
f.write(str(i))
▪ Ví dụ:
f3 = open("vidu3.txt", 'w')
for i in range(5):
for j in range(5):
f3.write(str(i+j)+' ')
f3.write('\n')
f3.close()
Ví dụ 1
❖ Tạo file văn bản ‘songuyen.txt’ ghi các số
nguyên trong khoảng từ 10 đến 99 theo định
dạng 10 số trên 1 dòng, mỗi số cách nhau một
dấu cách ' '.
Ví dụ 1a
❖ Tạo file văn bản ‘songuyen.txt’ ghi các số nguyên
trong khoảng từ 10 đến 99 theo định dạng 10 số
trên 1 dòng, mỗi số cách nhau một dấu cách ' '.
f = open("songuyen.txt",'w')
d = 0;
for i in range(10,100):
f.write(str(i) +' ')
d += 1
if d%10 == 0:
f.write('\n')
f.close()
Ví dụ 1b
❖ Tạo file văn bản ‘songuyen.txt’ ghi các số
nguyên trong khoảng từ 10 đến 99 theo định
dạng 10 số trên 1 dòng, mỗi số cách nhau một
dấu cách ' '.
f = open("songuyen.txt",'w')
for i in range(10,100):
f.write(str(i) +' ')
if d%10 == 9:
f.write('\n')
f.close()
Ví dụ 2
Tạo file văn bản ‘songuyen.txt’ ghi các số nguyên dương
nhập vào từ bàn phím cho tới khi không nhập (nhấn phím
Enter), trong đó mỗi số viết cách nhau 1 dấu cách, cứ ghi 5
số thì xuống dòng mới.
Ví dụ 2a
Tạo file văn bản ‘songuyen.txt’ ghi các số nguyên dương nhập vào từ
bàn phím (nhấn phím Enter để kết thúc nhập), trong đó mỗi số viết cách
nhau 1 dấu cách, cứ ghi 5 số thì xuống dòng mới.
f = open("C:/python/songuyen.txt",'w')
d = 0;
while 1>0:
a = input("Nhap so: ")
if a!='':
if a.isdigit():
f.write(a + ' ')
d += 1
if d%5 == 0:
f.write('\n')
else:
break
f.close()
Ví dụ 2b
Tạo file văn bản ‘songuyen.txt’ ghi các số nguyên dương nhập vào từ
bàn phím (nhấn phím Enter để kết thúc nhập), trong đó mỗi số viết cách
nhau 1 dấu cách, cứ ghi 5 số thì xuống dòng mới.
f = open("songuyen.txt",'w')
d = 0;
while 1>0:
a = input("Nhap so: ")
if a!='':
if not(a.isdigit()):
continue
f.write(a + ' ')
d += 1
if d%5 == 0:
f.write('\n')
else:
break
f.close()
Ví dụ 2c
Tạo file văn bản ghi các số nguyên dương nhập vào từ bàn phím (nhấn phím Enter để kết thúc
nhập), trong đó mỗi số viết cách nhau 1 dấu cách, cứ ghi 5 số thì xuống dòng mới.
f = open("songuyen.txt",'r')
List_lines = f.readlines()
f.close()
kq = 0
for s in List_lines:
L = s.split()
for x in L:
y = int(x)
if y%2 == 1:
kq += y
print("Tong cac so hang le: ",kq)
Ví dụ 4b
❖ Đọc dữ liệu từ file "songuyen.txt". Sau đó tính
tổng các số nguyên lẻ ra màn hình.
kq = 0
for line in open("songuyen.txt", encoding = 'utf-8'):
L = line.split()
for x in L:
y = int(x)
if y%2 == 1:
kq += y
print("Tong cac so hang le: ",kq)
Ví dụ 5
❖ Đọc dữ liệu từ file "songuyen.txt". Sau đó tính
tổng các số nguyên lẻ và ghi lại vào file.
f = open("songuyen.txt", 'r')
kq = 0
for line in f:
L = line.split()
for x in L:
y = int(x)
if y%2 == 1:
kq += y
f.close()
f = open("songuyen.txt", 'a')
f.write("\nTong cac so hang le: "+str(kq))
f.close()
Ví dụ 6
File ‘dssv.txt’ có mỗi dòng là số báo danh và họ
tên của sinh viên (cách nhau 1 dấu cách ' ‘).
File ‘phach.txt’ có mỗi dòng là số báo danh và số
phách (cách nhau 1 dấu cách ‘ ‘)
File ‘diem.txt’ có mỗi dòng là số phách và điểm
của sinh viên (cách nhau 1 dấu cách ' ')
Ví dụ 6
Đọc file ‘dssv.txt’ lưu vào 1 từ điển dssv có định
dạng {<sbd>: <họ tên>}
Đọc file ‘phach.txt’ lưu vào 1 từ điển phach có
định dạng {<sbd>: <phách>}
Đọc file ‘diem.txt’ lưu vào 1 từ điển diem có định
dạng {<phách>: <điểm>}
Lưu thông tin của thí sinh dưới dạng 1 bộ (số báo
danh, họ tên, điểm) vào danh sách, sắp xếp danh
sách theo thứ tự giảm dần của điểm.
Ví dụ 6
f1 = open("dssv.txt",'r') for x in phach_line:
f2 = open("phach.txt",'r') x.strip()
f3 = open("diem.txt",'r') L = x.split()
dssv_line = f1.readlines() sbd = L[0].strip()
phach_line = f2.readlines() ph = L[1].strip()
diem_line = f3.readlines() phach[sbd] = ph
#tao tu dien dssv print("\nSBD-Phach:",phach)
dssv = {} #tao tu dien diem
for x in dssv_line: diem = {}
x.strip() for x in diem_line:
L = x.split(' ',1) x.strip()
sbd = L[0].strip() L = x.split()
hoten = L[1].strip() ph = L[0].strip()
dssv[sbd] = hoten di = L[1].strip()
print("\nSSSV:",dssv) diem[ph] = di
#tao tu dien phach print("\nPhach-Diem:",diem)
phach = {}
Ví dụ 6
KQ = []
for x,y in phach.items():
SBD = x
Diem = int(diem[y])
Ten = dssv[SBD]
KQ.append((SBD,Ten,Diem))
KQ.sort(key = lambda hs:hs[2], reverse = True)
print("Danh sach diem sinh vien theo thu tu giam dan:")
for x in KQ:
print("{:<5} {:<20} {:<5}".format(x[0],x[1],x[2]))
Ví dụ 6
Lưu thông tin của thí sinh dưới dạng 1 bộ (số báo
danh, họ tên, điểm) vào danh sách KQ, sắp xếp
danh sách theo thứ tự giảm dần của điểm và ghi
vào file ketqua.txt với thông tin của 1 thí sinh
được ghi trên 1 dòng.
Ví dụ 6
f1 = open("dssv.txt",'r') for x in phach_line:
f2 = open("phach.txt",'r') x.strip()
f3 = open("diem.txt",'r') L = x.split()
dssv_line = f1.readlines() sbd = L[0].strip()
phach_line = f2.readlines() ph = L[1].strip()
diem_line = f3.readlines() phach[sbd] = ph
#tao tu dien dssv print("\nSBD-Phach:",phach)
dssv = {} #tao tu dien diem
for x in dssv_line: diem = {}
x.strip() for x in diem_line:
L = x.split(' ',1) x.strip()
sbd = L[0].strip() L = x.split()
hoten = L[1].strip() ph = L[0].strip()
dssv[sbd] = hoten di = L[1].strip()
print("\nSSSV:",dssv) diem[ph] = di
#tao tu dien phach print("\nPhach-Diem:",diem)
phach = {}
Ví dụ 6
KQ = []
for x,y in phach.items():
SBD = x
Diem = int(diem[y])
Ten = dssv[SBD]
KQ.append((SBD,Ten,Diem))
KQ.sort(key = lambda hs:hs[2], reverse = True)
print("Danh sach diem sinh vien theo thu tu giam
dan:")
for x in KQ:
print("{:<5} {:<20} {:<5}".format(x[0],x[1],x[2]))
#tao ket qua
f4 = open("ketqua.txt",'w')
for x in KQ:
line = x[0]+ ' '+ x[1]+ ' '+ str(x[2])
f4.write(line)
f4.write('\n')
f1.close()
f2.close()
f3.close()
f4.close()
Ví dụ 7
❖ Nhập DSSV gồm SBD, Họ
tên, ĐTB cho tới khi nhập
SBD là chuỗi rỗng.
❖Ghi vào file DSSV theo thứ tự
giảm dần của điểm
Ví dụ 7
KQ = []
while 1>0:
SBD = input("SBD: ")
if SBD =="":
break
Ten = input("Ho ten: ")
DTB = float(input("Diem TB: "))
KQ.append((SBD,Ten,DTB))
47
Phương thức làm việc với con trỏ tập tin
48
Các phương thức khác của tập tin
Phương thức Chức năng
fileno() Trả về một số nguyên là mã định danh của tập tin
flush() Đẩy dữ liệu khỏi vùng đệm, ghi xuống thiết bị lưu trữ
isatty() Trả về True nếu tập tin được kết nối với một thiết bị đầu cuối
read(N) Đọc N byte tiếp theo của tập tin
readable() Trả về True nếu tập tin có thể đọc được
readline() Đọc và trả về một dòng từ tập tin
readlines() Đọc và trả về một danh sách các dòng từ tập tin
truncate(size) Cắt tập tin hiện tại lấy đúng thành size byte đầu tiên
writable() Trả về True nếu tập tin có thể ghi được.
write(S) Ghi nội dung biến S xuống tập tin
Ghi nội dung biến lines xuống tập tin, biến này là một danh sách
writelines(lines)
các chuỗi, các chuỗi sẽ được ghi liên tiếp xuống tập tin
49
5. Làm việc với hệ thống
thư mục
Làm việc với hệ thống thư mục
❖Các phương thức quản lý tập tin và thư mục đều thuộc
thư viện os (import os)
❖Các phương thức loại này đều có thể sinh lỗi OSError
❖Để tương thích giữa các hệ điều hành, Python xem các
dấu gạch chéo đều là dấu phân tách đường dẫn
➢Nghĩa là "c:\\test", r’c:\test’ và "c:/test" được coi là
như nhau
❖Lấy thư mục làm việc hiện tại: os.getcwd()
➢Trường hợp lấy str dạng mã ASCII thì dùng
os.getcwdb()
❖Thay đổi thư mục làm việc: os.chdir(path) với path là
đường dẫn đến thư mục mới
❖Tạo thư mục mới: os.mkdir(path)
51
Làm việc với hệ thống thư mục
❖Lấy danh sách các thư mục và tập tin nằm trong
thư mục path: os.listdir(path)
➢Nếu bỏ tham số path thì lấy danh sách từ thư mục
hiện tại
❖Đổi tên thư mục hoặc tập tin: os.rename(old,
new)
➢Phương thức làm việc với cả tập tin và thư mục
❖Xóa bỏ tập tin: os.remove(filename)
❖Xóa bỏ thư mục: os.rmdir(path)
➢Phương thức chỉ xóa được thư mục trống
➢Trường hợp muốn xóa thư mục bất kể nó trống hay
không, có thể sử dụng phương thức
shutil.rmtree(path) (cần import thư viện shutil)
52
Phân giải đường dẫn theo thư mục làm việc
# Chú ý: Python phân giải đường dẫn theo thư mục hiện tại
# Vì vậy cần rất cẩn thận khi viết đường dẫn trong các
lệnh
import os
# tạo thư mục abc trong thư mục hiện tại
os.mkdir('abc')
# tạo thư mục xyz trong thư mục abc thuộc thư mục hiện tại
os.mkdir('abc/xyz')
# tạo thư mục abc trong trong thư mục temp thuộc ổ đĩa C
os.mkdir('C:/temp/abc')
53
Ví dụ
54
Bài tập 1
Tạo file chứa các dòng văn bản nhập từ bàn phím:
filename = input("Ten file: ")
f = open(filename, 'w')
i=0
while 1>0:
i += 1
s = input("Dong %d: "%i)
if s!='':
f.writelines(s+'\n')
else:
break
f.close()
Bài tập 1
1. Đọc 1 file và in ra màn hình 5 dòng đầu tiên, nếu file
không đủ 5 dòng thì in toàn bộ nội dung file.
filename = input("Ten file: ")
f = open(filename, 'r')
L = f.readlines()
for i in range(min(5,len(L))):
print(L[i].rstrip('\n'))
f.close()
Bài tập 2
Đọc 1 file và in ra màn hình 5 dòng cuối cùng, nếu file không
đủ 5 dòng thì in toàn bộ nội dung file.
6.Bài tập
Bài tập
1. Đọc 1 file và in ra màn hình 5 dòng đầu tiên, nếu file không
đủ 5 dòng thì in toàn bộ nội dung file.
2. Đọc 1 file và in ra màn hình 5 dòng cuối cùng, nếu file
không đủ 5 dòng thì in toàn bộ nội dung file.
3. Đọc 1 file, tìm và in ra nội dung của dòng dài nhất trong file
đó
4. Đọc 1 file, tìm và in ra từ dài nhất trong file
5. Đọc 1 file, thống kê và in ra tất cả các chữ cái có trong file
và số lần xuất hiện của các chữ đó
6. Đọc 1 file, thống kê và tần xuất xuất hiện của tất cả các từ
trong file, in theo thứ tự giảm dần của số lần xuất hiện
Bài tập
7. Đọc tập tin văn bản abc.txt sau đó chuyển nội dung đọc
được sang chữ in hoa và ghi vào tập tin xyz.txt
8. Đọc tập tin văn bản abc.txt, lọc lấy tất cả các số trong dữ
liệu đọc được và ghi chúng lần lượt vào tập tin number.txt,
mỗi số ghi trên một dòng
9. Nhập tên của hai tập tin văn bản, đọc và so sánh xem nội
dung của hai tập tin có giống nhau hay không
10. Lấy danh sách các tập tin trong thư mục hiện tại, tiến hành
so sánh nội dung của các tập tin trong thư mục, và chỉ ra các
tập tin có nội dung giống nhau. Chương trình in ra các nhóm
tập tin có cùng nội dung, đánh số các nhóm tăng dần bắt đầu
từ 1
Bài tập
11. Ảnh jpg là một tập tin nhị phân có đặc điểm là 4byte dữ
liệu từ vị trí thứ 6 đến thứ 9 tạo thành chữ JFIF (vị trí bắt
đầu tính từ số 0). Hãy nhập tên tập tin, kiểm tra xem đó có
thể là tập tin ảnh jpg không?
12. Ảnh bitmap (BMP) là một tập tin nhị phân:
- 2byte đầu tạo nên chữ BM
- 4byte từ vị trí 18-21 tạo nên số nguyên 4byte là số dòng
(chiều cao) của ảnh
- 4byte từ vị trí 22-25 tạo nên số nguyên 4byte là số cột
(chiều ngang) của ảnh
Nhập tên tập tin, cho biết đó có phải là ảnh bitmap không,
nếu đúng thì in ra cỡ của ảnh (dòng x cột)