10. Chuyến tham quan ngắn gọn về thư viện tiêu chuẩn¶
10.1. Giao diện hệ điều hành¶
Mô-đun os cung cấp hàng tá chức năng để tương tác với hệ điều hành
>>> nhập hệ điều hành
>>> os.getcwd() # Return thư mục làm việc hiện tại
'C:\\Python314'
>>> os.chdir('/server/accesslogs') # Change thư mục làm việc hiện tại
>>> os.system('mkdir hôm nay') # Run lệnh mkdir trong shell hệ thống
0
Đảm bảo sử dụng kiểu import os thay vì from os import *. Điều này sẽ giúp os.open() không làm mờ chức năng open() tích hợp hoạt động khác nhiều.
Các chức năng dir() và help() tích hợp sẵn rất hữu ích như các công cụ hỗ trợ tương tác để làm việc với các mô-đun lớn như os:
>>> nhập hệ điều hành
>>> thư mục(os)
<trả về danh sách tất cả các chức năng của mô-đun>
>>> trợ giúp(os)
<trả về một trang hướng dẫn mở rộng được tạo từ chuỗi tài liệu của mô-đun>
Đối với các tác vụ quản lý thư mục và tệp hàng ngày, mô-đun shutil cung cấp giao diện cấp cao hơn, dễ sử dụng hơn:
>>> nhập khẩu đóng cửa
>>> Shutil.copyfile('data.db', 'archive.db')
'lưu trữ.db'
>>> Shutil.move('/build/executables', 'installdir')
'installdir'
10.2. Ký tự đại diện tệp¶
Mô-đun glob cung cấp chức năng tạo danh sách tệp từ tìm kiếm ký tự đại diện thư mục
>>> nhập khẩu toàn cầu
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
10.3. Đối số dòng lệnh¶
Các tập lệnh tiện ích phổ biến thường cần xử lý các đối số dòng lệnh. Các đối số này được lưu trữ trong thuộc tính argv của mô-đun sys dưới dạng danh sách. Ví dụ: hãy lấy tệp demo.py sau:
# File demo.py
hệ thống nhập khẩu
in(sys.argv)
Đây là kết quả từ việc chạy python demo.py one two three ở dòng lệnh:
['demo.py', 'một', 'hai', 'ba']
Mô-đun argparse cung cấp một cơ chế phức tạp hơn để xử lý các đối số dòng lệnh. Tập lệnh sau trích xuất một hoặc nhiều tên tệp và số dòng tùy chọn sẽ được hiển thị:
nhập khẩu argparse
trình phân tích cú pháp = argparse.ArgumentParser(
prog='top',
description='Hiển thị các dòng trên cùng của mỗi tệp')
parser.add_argument('filenames', nargs='+')
Parser.add_argument('-l', '--lines', type=int, default=10)
args = trình phân tích cú pháp.parse_args()
in(args)
Khi chạy ở dòng lệnh với python top.py --lines=5 alpha.txt beta.txt, tập lệnh sẽ đặt args.lines thành 5 và args.filenames thành ['alpha.txt', 'beta.txt'].
10.4. Lỗi chuyển hướng đầu ra và chấm dứt chương trình¶
Mô-đun sys cũng có các thuộc tính dành cho stdin, stdout và stderr. Cái sau rất hữu ích trong việc đưa ra các cảnh báo và thông báo lỗi để hiển thị chúng ngay cả khi stdout đã được chuyển hướng
>>> sys.stderr.write('Cảnh báo, không tìm thấy tệp nhật ký khi bắt đầu một tệp mới\n')
Cảnh báo, không tìm thấy tệp nhật ký khi bắt đầu một tệp mới
Cách trực tiếp nhất để chấm dứt tập lệnh là sử dụng sys.exit().
10.5. So khớp mẫu chuỗi¶
Mô-đun re cung cấp các công cụ biểu thức chính quy để xử lý chuỗi nâng cao. Đối với việc so khớp và thao tác phức tạp, biểu thức chính quy cung cấp các giải pháp ngắn gọn, tối ưu hóa:
>>> nhập lại
>>> re.findall(r'\bf[a-z]*', 'chân hoặc tay nào rơi nhanh nhất')
['chân', 'ngã', 'nhanh nhất']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'con mèo đội mũ')
'mèo đội mũ'
Khi chỉ cần những khả năng đơn giản, các phương thức chuỗi được ưu tiên vì chúng dễ đọc và gỡ lỗi hơn:
>>> 'tea for too'.replace('too', 'two')
'trà cho hai người'
10.6. Toán học¶
Mô-đun math cung cấp quyền truy cập vào các hàm thư viện C cơ bản cho phép toán dấu phẩy động
>>> nhập toán
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10,0
Mô-đun random cung cấp các công cụ để thực hiện các lựa chọn ngẫu nhiên:
>>> nhập ngẫu nhiên
>>> ngẫu nhiên.choice(['apple', 'lê', 'chuối'])
'quả táo'
>>> Random.sample(range(100), 10) # sampling không cần thay thế
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> Random.random() # random nổi từ khoảng [0,0, 1,0)
0.17970987693706186
>>> số nguyên ngẫu nhiên.randrange(6) # random được chọn từ phạm vi(6)
4
Mô-đun statistics tính toán các thuộc tính thống kê cơ bản (giá trị trung bình, trung vị, phương sai, v.v.) của dữ liệu số:
>>> thống kê nhập khẩu
>>> dữ liệu = [2,75, 1,75, 1,25, 0,25, 0,5, 1,25, 3,5]
>>> thống kê.mean(dữ liệu)
1.6071428571428572
>>> thống kê.median(dữ liệu)
1,25
>>> thống kê.phương sai (dữ liệu)
1.3720238095238095
Dự án SciPy <https://scipy.org> có nhiều mô-đun khác để tính toán số.
10.7. truy cập Internet¶
Có một số mô-đun để truy cập internet và xử lý các giao thức internet. Hai trong số những cách đơn giản nhất là urllib.request để lấy dữ liệu từ URL và smtplib để gửi thư:
>>> từ urllib.request nhập urlopen
>>> với urlopen('https://python.go-mizu.dev/') làm phản hồi:
... cho dòng phản hồi:
... line = line.decode() # Convert byte thành một str
... nếu 'được cập nhật' trong dòng:
... print(line.rstrip()) # Remove theo dõi dòng mới
...
Cập nhật lần cuối vào ngày 11 tháng 11 năm 2025 (20:11 UTC).
>>> nhập smtplib
>>> máy chủ = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """Tới: jcaesar@example.org
... Từ: soothsayer@example.org
...
... Hãy coi chừng những ý tưởng của tháng Ba.
... """)
>>> server.quit()
(Lưu ý rằng ví dụ thứ hai cần một máy chủ thư chạy trên localhost.)
10.8. Ngày và giờ¶
Mô-đun datetime cung cấp các lớp để thao tác ngày và giờ theo cả cách đơn giản và phức tạp. Mặc dù số học ngày và giờ được hỗ trợ nhưng trọng tâm của việc triển khai là trích xuất thành phần hiệu quả để định dạng và thao tác đầu ra. Mô-đun này cũng hỗ trợ các đối tượng nhận biết múi giờ.
>>> # dates dễ dàng xây dựng và định dạng
>>> nhập ngày giờ dưới dạng dt
>>> bây giờ = dt.date.today()
>>> bây giờ
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y là %A vào ngày %d của %B.")
'02-12-03. Ngày 02 tháng 12 năm 2003 là thứ Ba vào ngày 02 tháng 12.'
>>> # dates hỗ trợ số học lịch
>>> sinh nhật = dt.date(1964, 7, 31)
>>> tuổi = bây giờ - sinh nhật
>>> tuổi.ngày
14368
10.9. nén dữ liệu¶
Các định dạng lưu trữ và nén dữ liệu phổ biến được hỗ trợ trực tiếp bởi các mô-đun bao gồm: zlib, gzip, bz2, lzma, zipfile và tarfile.
>>> nhập zlib
>>> s = b'witch có đồng hồ đeo tay phù thủy'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch có đồng hồ đeo tay phù thủy'
>>> zlib.crc32(s)
226805979
10.10. Đo lường hiệu suất¶
Một số người dùng Python có mối quan tâm sâu sắc đến việc biết hiệu suất tương đối của các cách tiếp cận khác nhau đối với cùng một vấn đề. Python cung cấp một công cụ đo lường để trả lời những câu hỏi đó ngay lập tức.
Ví dụ: có thể bạn nên sử dụng tính năng đóng gói và giải nén bộ dữ liệu thay vì cách tiếp cận truyền thống để hoán đổi đối số. Mô-đun timeit nhanh chóng thể hiện lợi thế hiệu suất khiêm tốn:
>>> từ bộ đếm thời gian nhập timeit
>>> Bộ đếm thời gian('t=a; a=b; b=t', 'a=1; b=2').timeit()
0,57535828626024577
>>> Bộ đếm thời gian('a,b = b,a', 'a=1; b=2').timeit()
0,54962537085770791
Ngược lại với mức độ chi tiết tốt của timeit, các mô-đun profile và pstats cung cấp các công cụ để xác định các phần quan trọng về thời gian trong các khối mã lớn hơn.
10.11. Kiểm soát chất lượng¶
Một cách tiếp cận để phát triển phần mềm chất lượng cao là viết các bài kiểm tra cho từng chức năng khi nó được phát triển và chạy các bài kiểm tra đó thường xuyên trong quá trình phát triển.
Mô-đun doctest cung cấp công cụ để quét mô-đun và xác thực các bài kiểm tra được nhúng trong chuỗi tài liệu của chương trình. Việc xây dựng thử nghiệm đơn giản như việc cắt và dán một lệnh gọi thông thường cùng với kết quả của nó vào chuỗi tài liệu. Điều này cải thiện tài liệu bằng cách cung cấp cho người dùng một ví dụ và nó cho phép mô-đun doctest đảm bảo mã vẫn đúng với tài liệu:
trung bình def (giá trị):
"""Tính trung bình số học của một danh sách các số.
>>> print(trung bình([20, 30, 70]))
40,0
"""
trả về tổng(giá trị) / len(giá trị)
nhập doctest
doctest.testmod() # automatically xác thực các bài kiểm tra được nhúng
Mô-đun unittest không dễ dàng như mô-đun doctest nhưng nó cho phép duy trì một bộ thử nghiệm toàn diện hơn trong một tệp riêng biệt:
nhập khẩu đơn vị nhất
lớp TestStatisticalFunctions(unittest.TestCase):
def test_average(tự):
self.assertEqual(trung bình([20, 30, 70]), 40.0)
self.assertEqual(round(trung bình([1, 5, 7]), 1), 4.3)
với self.assertRaises(ZeroDivisionError):
trung bình([])
với self.assertRaises(TypeError):
trung bình(20, 30, 70)
unittest.main() # Calling từ dòng lệnh gọi tất cả các bài kiểm tra
10.12. Bao gồm pin¶
Python có triết lý "bao gồm pin". Điều này được thể hiện rõ nhất qua khả năng phức tạp và mạnh mẽ của các gói lớn hơn. Ví dụ:
Các mô-đun
xmlrpc.clientvàxmlrpc.serverkhiến việc thực hiện các lệnh gọi thủ tục từ xa trở thành một nhiệm vụ gần như tầm thường. Bất chấp tên của các mô-đun, không cần có kiến thức trực tiếp hoặc cách xử lý XML.Gói
emaillà một thư viện để quản lý email, bao gồm MIME và các tài liệu thư dựa trên RFC 5322 khác. Không giống nhưsmtplibvàpoplibthực sự gửi và nhận tin nhắn, gói email có bộ công cụ hoàn chỉnh để xây dựng hoặc giải mã các cấu trúc tin nhắn phức tạp (bao gồm cả tệp đính kèm) và để triển khai các giao thức tiêu đề và mã hóa internet.Gói
jsoncung cấp hỗ trợ mạnh mẽ để phân tích định dạng trao đổi dữ liệu phổ biến này. Mô-đuncsvhỗ trợ đọc và ghi trực tiếp các tệp ở định dạng Giá trị được phân tách bằng dấu phẩy, thường được cơ sở dữ liệu và bảng tính hỗ trợ. Quá trình xử lý XML được hỗ trợ bởi các góixml.etree.ElementTree,xml.domvàxml.sax. Cùng với nhau, các mô-đun và gói này đơn giản hóa đáng kể việc trao đổi dữ liệu giữa các ứng dụng Python và các công cụ khác.Mô-đun
sqlite3là một trình bao bọc cho thư viện cơ sở dữ liệu SQLite, cung cấp cơ sở dữ liệu liên tục có thể được cập nhật và truy cập bằng cú pháp SQL hơi không chuẩn.Quốc tế hóa được hỗ trợ bởi một số mô-đun bao gồm
gettext,localevà góicodecs.