Mô-đun os
(os là viết tắt của operating system) cung cấp hàng tá chức năng để tương tác với hệ điều hành:
>>> import os
>>> os.getcwd() # Quay về thư mục làm việc hiện tại
'C:\\Python36'
>>> os.chdir('/server/accesslogs') # Thay đổi thư mục làm việc hiện tại
>>> os.system('mkdir today') # Chạy lệnh mkdir trong thông dịch dòng lệnh hệ thống (the system shell)
0
Hãy dùng import os
thay vì from os import *
. Điều này giữ cho os.open()
khỏi việc che mờ hàm được dựng sẵn open()
khiến các hoạt động sai khác đáng kể.
Các hàm dựng sẵn dir()
và help()
hữu ích giống như những hỗ trợ tương tác để làm việc với các mô đun (modules) lớn như os
:
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>
Đố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:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
Mô-đun glob
cung cấp một hàm để tạo danh sách tệp từ các tìm kiếm theo ký tự đại diện:
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
Các tập lệnh (scripts) 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 (module) sys
dưới dạng danh sách. Ví dụ kết quả đầu ra sau đây từ chạy python demo.py one two three
tại dòng lệnh:
>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']
Mô-đun getopt
xử lý sys.argv bằng cách sử dụng các quy ước của hàm getopt()
trên Unix. Xử lý dòng lệnh mạnh mẽ và linh hoạt hơn được cung cấp bởi mô-đun argparse
.
10.4. Lỗi chuyển hướng đầu ra và kết thúc chương trình (Error Output Redirection and Program Termination)
Mô-đun sys
cũng có các thuộc tính cho stdin, stdout, and stderr. Cái sau cùng hữu ích khi phát 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('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
Cách trực tiếp nhất để chấm dứt tập lệnh là sử dụng sys.exit()
.
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 sánh và thao tác phức tạp, biểu thức chính quy cung cấp các giải pháp gọn gàng, được tối ưu hóa:>>>
>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
Khi chỉ có các khả năng đơn giản là cần thiết, các phương thức chuỗi được ưa thích vì chúng dễ đọc và gỡ lỗi hơn:>>>
>>> 'tea for too'.replace('too', 'two')
'tea for two'
The math
module gives access to the underlying C library functions for floating point math:>>>
Mô-đun math
cho phép truy cập vào các hàm thư viện C bên dưới cho phép toán trên số thực (floating point math):>>>
>>> import math
>>> 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:>>>
>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10) # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # random float
0.17970987693706186
>>> random.randrange(6) # random integer chosen from range(6)
4
Mô-đun statistics
tính toán các thuộc tính thông kê cơ bản (the mean, median, variance, etc.) của dữ liệu số:>>>
>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095
Dự án SciPy <https://scipy.org> có nhiều mô-đun khác để tính toán số.
Có một số mô-đun để truy cập internet và xử lý các giao thức internet. Hai trong số mô-đun đơn giản nhất là urllib.request
để truy xuất dữ liệu từ các URLs và smtplib
để gửi thư:>>>
>>> from urllib.request import urlopen
>>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response:
... for line in response:
... line = line.decode('utf-8') # Decoding the binary data to text.
... if 'EST' in line or 'EDT' in line: # look for Eastern Time
... print(line)
<BR>Nov. 25, 09:43:32 PM EST
>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('[email protected]', '[email protected]',
... """To: [email protected]
... From: [email protected]
...
... Beware the Ides of March.
... """)
>>> server.quit()
(Lưu ý rằng ví dụ thứ hai cần một máy chủ thư (mailserver) chạy trên máy chủ cục bộ (localhost).)
Mô-đun [datetime
] (https://docs.python.org/3/library/datetime.html#module-datetime) cung cấp các lớp (classes) để thao tác ngày tháng và thời gian theo cả hai cách đơn giản và phức tạp. Trong khi ngày giờ số học được hỗ trợ, trọng tâm của việc thực hiện (implementation) là trích xuất thành viên hiệu quả cho định dạng đầu ra và thao tác. Mô-đun này cũng hỗ trợ các đối tượng nhận biết múi giờ. >>>
>>> # ngày giờ được xây dựng và định dạng dễ dàng
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
>>> # ngày hỗ trợ số học lịch (calender)
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
Các định dạng nén và lưu trữ dữ liệu được hỗ trợ trực tiếp bởi các mô-đun bao gồm: zlib
, gzip
, bz2
, lzma
, zipfile
and tarfile
.>>>
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
Một số người dùng Python phát triển một sự quan tâm sâu sắc trong việc biết hiệu suất tương đối của các cách tiếp cận khác nhau cho cùng một vấn đề. Python cung cấp một công cụ đo lường để trả lời các câu hỏi đó ngay lập tức.
For example, it may be tempting to use the tuple packing and unpacking feature instead of the traditional approach to swapping arguments. The timeit
module quickly demonstrates a modest performance advantage:>>>
Ví dụ, nó có thể hấp dẫn để sử dụng tính năng đóng gói và giải nén tuple thay vì cách tiếp cận truyền thống để hoán đổi đối số. Mô-đun timeit
chứng tỏ một cách nhanh chóng về lợi thế hiệu suất: > > >
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
Ngược lại với mức độ chi tiết của timeit
, các mô-đun profile
và pstats
cung cấp các công cụ cho việc xác định các phần thời gian quan trọng trong các khối mã (code) lớn hơn.
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 thử (tests) cho từng chức năng khi nó được phát triển và chạy các bài kiểm thử đó 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 thử được nhúng trong tài liệu của chương trình. Việc xây dựng kiểm thử đơn giản như việc cắt và dán thông thường cùng với các kết quả của nó vào trong tài liệu (docstring). Đ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ã (code) vẫn đúng với tài liệu:
def average(values):
"""Computes the arithmetic mean of a list of numbers.
>>> print(average([20, 30, 70]))
40.0
"""
return sum(values) / len(values)
import doctest
doctest.testmod() # automatically validate the embedded tests
Mô-đun unittest
không dễ dàng như mô-đun doctest
, nhưng nó cho phép kiểm tra toàn diện hơn được duy trì trong một tệp riêng biệt:
import unittest
class TestStatisticalFunctions(unittest.TestCase):
def test_average(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
with self.assertRaises(ZeroDivisionError):
average([])
with self.assertRaises(TypeError):
average(20, 30, 70)
unittest.main() # Gọi từ dòng lệnh kích hoạt tất cả các trường hợp kiểm thử
### 10.12. Pin đi kèm (Batteries Included)
Python có triết lý [“pin đi kèm”](https://www.quora.com/What-does-batteries-included-philosophy-mean), tức là Python có sẵn các gói và mô-đun của chính nó mà không cần hoặc ít phụ thuộc vào mô-đun bên ngoài. Điều này là được nhìn thấy rõ nhất thông qua các khả năng tinh vi và mạnh mẽ của các gói (packages) lớn hơn của Python. Ví dụ:
* Các mô-đun [`xmlrpc.client`](https://docs.python.org/3/library/xmlrpc.client.html#module-xmlrpc.client) và [`xmlrpc.server`](https://docs.python.org/3/library/xmlrpc.server.html#module-xmlrpc.server) thực hiện các cuộc gọi thủ tục từ xa thành một nhiệm vụ gần như bình thường. Mặc dù tên mô-đun như vậy, nhưng không cần kiến thức trực tiếp hoặc xử lý XML.
* Gói [`email`](https://docs.python.org/3/library/email.html#module-email) là một thư viện để quản lý thư điện tử, bao gồm MIME và các tài liệu tin nhắn dựa trên RFC 2822 khác. Không giống như [`smtplib`](https://docs.python.org/3/library/smtplib.html#module-smtplib) và [`poplib`](https://docs.python.org/3/library/poplib.html#module-poplib) thực chất là 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ấu trúc thư phức tạp \(bao gồm tệp đính kèm \) và để triển khai giao thức mã hóa và tiêu đề internet.
* Gói [`json`](https://docs.python.org/3/library/json.html#module-json) cung cấp hỗ trợ mạnh mẽ để phân tích cú pháp định dạng trao đổi dữ liệu phổ biến này. Mô-đun [`csv`](https://docs.python.org/3/library/csv.html#module-csv) hỗ 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 (Comma-Separated Value), thường được hỗ trợ bởi cơ sở dữ liệu và bảng tính. Xử lý XML được hỗ trợ bởi các gói [`xml.etree.ElementTree`](https://docs.python.org/3/library/xml.etree.elementtree.html#module-xml.etree.ElementTree), [`xml.dom`](https://docs.python.org/3/library/xml.dom.html#module-xml.dom) và [`xml.sax`](https://docs.python.org/3/library/xml.sax.html#module-xml.sax). Cùng với nhau, các mô-đun và gói này đơn giản hóa 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 [`sqlite3`](https://docs.python.org/3/library/sqlite3.html#module-sqlite3) là một trình vỏ bọc (a wrapper) cho thư viện cơ sở dữ liệu SQLite, cung cấp một cơ sở dữ liệu liên tục có thể được cập nhật và truy cập bằng cách sử dụng cú pháp SQL.
* Quốc tế hóa được hỗ trợ bởi rất nhiều mô-đun bao gồm các gói [`gettext`](https://docs.python.org/3/library/gettext.html#module-gettext), [`locale`](https://docs.python.org/3/library/locale.html#module-locale), và the [`codecs`](https://docs.python.org/3/library/codecs.html#module-codecs).