Chủ đề [ATBS2nd]Chương 1 - Python cơ bản - Phần 23

Chào các bạn,
Chúng ta tiếp tục với việc học thao tác chuỗi trong Python.
Giá trị số của kí tự với các hàm ord() và chr()
Máy tính lưu trữ thông tin dưới dạng chuỗi byte của các số nhị phân, có nghĩa là chúng ta cần có khả năng chuyển đổi văn bản thành số. Do đó, mỗi ký tự văn bản có một giá trị số tương ứng được gọi là mã Unicode. Ví dụ: mã số là 65 cho ‘A’, 52 cho ‘4’ và 33 cho ‘!’. Bạn có thể sử dụng hàm ord() để lấy mã của chuỗi một ký tự và hàm chr() để lấy chuỗi một ký tự của một điểm mã nguyên. Nhập thông tin sau vào command line:

>>> ord('A')
65
>>> ord('4')
52
>>> ord('!')
33
>>> chr(65)
'A' 

Các hàm này rất hữu ích khi bạn cần thực hiện một thao tác sắp xếp hoặc toán học trên các ký tự:

>>> ord('B')
66
>>> ord('A') < ord('B')
True
>>> chr(ord('A'))
'A'
>>> chr(ord('A') + 1)
'B'

Copy và paste chuỗi với pyperclip module
Module pyperclip có các chức năng copy() và paste() có thể gửi văn bản đến và nhận văn bản từ bảng tạm trên máy tính của bạn. Gửi đầu ra của chương trình của bạn vào bảng tạm sẽ giúp bạn dễ dàng dán nó vào email, trình xử lý văn bản hoặc một số phần mềm khác.
Module pyperclip không có sẵn trong Python. Để cài đặt nó, hãy làm theo các hướng dẫn để cài đặt các module của bên thứ ba. Sau khi cài đặt pyperclip bằng lệnh pip install pyperclip, hãy nhập thông tin sau vào command line:

>>> import pyperclip
>>> pyperclip.copy('Hello, world!')
>>> pyperclip.paste()
'Hello, world!'

Project: Tự động gửi nhiều tin nhắn
Nếu bạn đã trả lời một số lượng lớn các email có cụm từ tương tự nhau, bạn có lẽ đã phải gõ rất nhiều lần. Có thể bạn giữ một tài liệu văn bản với các cụm từ này để bạn có thể dễ dàng sao chép và dán chúng vào bảng tạm. Nhưng clipboard của bạn chỉ có thể lưu trữ một tin nhắn tại một thời điểm, điều này rất tiện lợi. Hãy để làm cho quá trình này dễ dàng hơn một chút với một chương trình lưu trữ nhiều cụm từ.
Bước 1: Thiết kế chương trình và cấu trúc dữ liệu
Bạn muốn có thể chạy chương trình này với một đối số dòng lệnh là cụm từ khóa ngắn, ví dụ, agree hoặc busy. Thông báo được liên kết với cụm từ khóa đó sẽ được sao chép vào bảng tạm để người dùng có thể dán nó vào email. Bằng cách này, người dùng có thể có các tin nhắn dài, chi tiết mà không cần phải gõ lại chúng.
Mở cửa sổ soạn thảo tệp mới và lưu chương trình dưới dạng mclip.py. Bạn cần bắt đầu chương trình với một #! (shebang) ở dòng đầu tiên và cũng nên viết bình luận mô tả ngắn gọn về chương trình. Vì bạn muốn liên kết từng đoạn văn bản với cụm từ chính của nó, bạn có thể lưu trữ chúng dưới dạng chuỗi trong một từ điển. Từ điển sẽ là cấu trúc dữ liệu tổ chức các cụm từ và văn bản chính của bạn. Làm cho chương trình của bạn trông như sau:

#! python3
# mclip.py - A multi-clipboard program.
TEXT = {'agree': """Yes, I agree. That sounds fine to me.""",
		'busy': """Sorry, can we do this later this week or next week?""",
		'upsell': """Would you consider making this a monthly donation?"""}

Bước 2: Thao tác với đối số nhập từ dòng lệnh
Các đối số dòng lệnh sẽ được lưu trữ trong biến sys.argv. Mục đầu tiên trong danh sách sys.argv phải luôn là một chuỗi chứa tên file của chương trình (‘mclip.py’) và mục thứ hai nên là đối số dòng lệnh đầu tiên. Đối với chương trình này, đối số này là cụm từ chính của thông điệp bạn muốn. Vì đối số dòng lệnh là bắt buộc, bạn sẽ hiển thị thông báo sử dụng cho người dùng nếu họ quên thêm nó (nghĩa là, nếu danh sách sys.argv có ít hơn hai giá trị trong đó bạn phải hiển thị thông báo). Làm cho chương trình của bạn trông như sau:

#! python3
# mclip.py - A multi-clipboard program.
TEXT = {'agree': """Yes, I agree. That sounds fine to me.""",
		'busy': """Sorry, can we do this later this week or next week?""",
		'upsell': """Would you consider making this a monthly donation?"""}
		
import sys
if len(sys.argv) < 2:
	print('Usage: python mclip.py [keyphrase] - copy phrase text')
	sys.exit()
keyphrase = sys.argv[1] # first command line arg is the keyphrase

Copy đúng câu
Bây giờ cụm từ khóa được lưu trữ dưới dạng một chuỗi trong biến keyphrase, bạn cần xem liệu nó có tồn tại trong từ điển TEXT dưới dạng khóa hay không. Nếu vậy, bạn muốn sao chép giá trị khóa chính vào bảng tạm bằng pyperclip.copy (). (Vì bạn có thể sử dụng module pyperclip, nên bạn cần nhập nó.) Lưu ý rằng bạn không thực sự cần biến keyphrase; bạn chỉ có thể sử dụng sys.argv [1] ở mọi nơi keyphrase được sử dụng trong chương trình này. Nhưng một biến có tên là keyphrase dễ đọc hơn nhiều so với thứ gì đó khó hiểu như sys.argv [1]. Làm cho chương trình của bạn trông như sau:

#! python3
# mclip.py - A multi-clipboard program.
TEXT = {'agree': """Yes, I agree. That sounds fine to me.""",
		'busy': """Sorry, can we do this later this week or next week?""",
		'upsell': """Would you consider making this a monthly donation?"""}
		
import sys
if len(sys.argv) < 2:
	print('Usage: python mclip.py [keyphrase] - copy phrase text')
	sys.exit()
keyphrase = sys.argv[1] # first command line arg is the keyphrase

if keyphrase in TEXT:
	pyperclip.copy(TEXT[keyphrase])
	print('Text for ' + keyphrase + ' copied to clipboard.')
else:
	print('There is no text for ' + keyphrase) 

Mã mới này tìm trong từ điển TEXT cho cụm từ chính. Nếu cụm từ khóa là một khóa trong từ điển, chúng ta sẽ nhận được giá trị tương ứng với khóa đó, sao chép nó vào bảng tạm và in một thông báo nói rằng chúng ta đã sao chép giá trị.
Mặt khác, chúng tôi in một thông báo nói rằng ở đó không có cụm từ chính với tên đó. Đó là kịch bản hoàn chỉnh. Bạn sẽ phải sửa đổi giá trị từ điển TEXT trong nguồn bất cứ khi nào bạn muốn cập nhật chương trình với một tin nhắn mới.
Trên Windows, bạn có thể tạo một file batch để chạy chương trình này. Nhập thông tin sau vào trình chỉnh sửa file và lưu tệp dưới dạng mclip.bat trong thư mục C: \ Windows:

@py.exe C:\path_to_file\mclip.py %*
@pause

Khi bạn chạy trên windows bạn chỉ cần Win-R và chạy mclip key phrase.
Thêm dấu hoa thị vào Wiki Markup
Khi chỉnh sửa một bài viết Wikipedia, bạn có thể tạo một danh sách dấu đầu dòng bằng cách đặt từng mục danh sách trên dòng riêng của mình và đặt một ngôi sao ở phía trước. Nhưng nói rằng bạn có một danh sách thực sự lớn mà bạn muốn thêm điểm hoa thị vào. Bạn chỉ có thể gõ những hoa thị đó ở đầu mỗi dòng, từng cái một. Hoặc bạn có thể tự động hóa tác vụ này với một tập lệnh Python ngắn.
Tập lệnh BulletPointAdder.py sẽ lấy văn bản từ bảng ghi tạm, thêm dấu sao và dấu cách vào đầu mỗi dòng, sau đó dán văn bản mới này vào bảng tạm. Ví dụ: nếu tôi đã sao chép văn bản sau (cho bài viết Wikipedia “List of Lists of Lists”) vào bảng tạm:

Lists of animals
Lists of aquarium life
Lists of biologists by author abbreviation
Lists of cultivars

và sau đó chạy chương trình BulletPointAdder.py, bảng tạm sẽ chứa các mục sau:

* Lists of animals
* Lists of aquarium life
* Lists of biologists by author abbreviation
* Lists of cultivars

Văn bản có tiền tố ngôi sao này đã sẵn sàng để được dán vào một bài viết Wikipedia dưới dạng một danh sách gạch đầu dòng.
Copy và paste vào bảng tạm
Bạn muốn chương trình BulletPointAdder.py thực hiện như sau:

  1. Paste văn bản từ bảng tạm.

  2. Làm một điều gì đó.

  3. Copy văn bản mới vào bảng tạm.
    Bước thứ hai đó hơi khó, nhưng bước 1 và 3 khá đơn giản: chúng chỉ liên quan đến các hàm pyperclip.copy () và pyperclip.paste (). Hiện tại, hãy để Todo chỉ viết một phần của chương trình bao gồm các bước 1 và 3. Nhập phần sau, lưu chương trình dưới dạng BulletPointAdder.py:

#! python3
# bulletPointAdder.py - Adds Wikipedia bullet points to the start
# of each line of text on the clipboard.
import pyperclip
text = pyperclip.paste()
# TODO: Separate lines and add stars.
pyperclip.copy(text)

Comment TODO là một lời nhắc nhở rằng cuối cùng bạn nên hoàn thành phần này của chương trình. Bước tiếp theo là thực sự thực hiện phần đó của chương trình.
Tách dòng văn bản và thêm dấu hoa thị
Cuộc gọi đến pyperclip.paste () trả về tất cả văn bản trên bảng tạm dưới dạng một chuỗi lớn. Nếu chúng ta sử dụng ví dụ “List of Lists of Lists”, chuỗi được lưu trữ trong văn bản sẽ trông như thế này:
`

‘Lists of animals\nLists of aquarium life\nLists of biologists by author abbreviation\nLists of cultivars’

`
Ký tự \n dòng mới trong chuỗi này khiến nó được hiển thị với nhiều dòng khi nó được in hoặc dán từ bảng ghi tạm. Có rất nhiều dòng trên mạng trong một giá trị chuỗi này. Bạn muốn thêm một ngôi sao vào đầu mỗi dòng này.
Bạn có thể viết mã tìm kiếm cho mỗi ký tự dòng mới trong chuỗi và sau đó thêm ngôi sao ngay sau đó. Nhưng sẽ dễ dàng hơn khi sử dụng phương thức split () để trả về một danh sách các chuỗi, một chuỗi cho mỗi dòng trong chuỗi gốc và sau đó thêm dấu sao vào phía trước của mỗi chuỗi trong danh sách. Làm cho chương trình của bạn trông như sau:

#! python3
# bulletPointAdder.py - Adds Wikipedia bullet points to the start
# of each line of text on the clipboard.
import pyperclip
text = pyperclip.paste()
# Separate lines and add stars.
lines = text.split('\n')
for i in range(len(lines)): # loop through all indexes in the "lines" list
	lines[i] = '* ' + lines[i] # add star to each string in "lines" list
pyperclip.copy(text)

Chúng tôi chia văn bản dọc theo dòng mới của nó để có được một danh sách trong đó mỗi mục là một dòng của văn bản. Chúng tôi lưu trữ danh sách trong các dòng và sau đó lặp qua các mục trong dòng. Đối với mỗi dòng, chúng tôi thêm một ngôi sao và khoảng trắng vào đầu dòng. Bây giờ mỗi chuỗi trong dòng bắt đầu bằng một ngôi sao.
Nối những dòng đã thay đổi
Danh sách lines hiện chứa các dòng được sửa đổi bắt đầu bằng các ngôi sao. Nhưng pyperclip.copy () đang mong đợi một giá trị chuỗi đơn, tuy nhiên, không phải là danh sách các giá trị chuỗi. Để tạo giá trị chuỗi đơn này, chuyển lines vào phương thức join() để nhận một chuỗi đơn được nối từ danh sách chuỗi. Làm cho chương trình của bạn trông như sau:

#! python3
# bulletPointAdder.py - Adds Wikipedia bullet points to the start
# of each line of text on the clipboard.
import pyperclip
text = pyperclip.paste()
# Separate lines and add stars.
lines = text.split('\n')
for i in range(len(lines)): # loop through all indexes in the "lines" list
	lines[i] = '* ' + lines[i] # add star to each string in "lines" list
text = '\n'.join(lines)
pyperclip.copy(text)

Khi chương trình này được chạy, nó sẽ thay thế văn bản trên bảng tạm bằng văn bản có các ngôi sao ở đầu mỗi dòng. Bây giờ chương trình đã hoàn tất và bạn có thể thử chạy nó với văn bản được sao chép vào bảng tạm.
Ngay cả khi bạn không cần phải tự động hóa tác vụ cụ thể này, bạn có thể muốn tự động hóa một số loại thao tác văn bản khác, chẳng hạn như xóa khoảng trắng ở cuối dòng hoặc chuyển đổi văn bản thành chữ hoa hoặc chữ thường. Dù nhu cầu của bạn là gì, bạn có thể sử dụng bảng tạm cho đầu vào và đầu ra.
Người dịch: Hungdh

3 Likes