Thư viện mã Python hữu ích cho bạn sử dụng hàng ngày (phần 2)

Nội dung được viết bởi Lê Nguyễn Nhật Phương

Trong thư viện mã Python phần 1 chúng ta đã cùng tìm hiểu về các lệnh Python xử lý với hình ảnh, trang web cơ bản. Trong phần 2 này, Gitiho sẽ tiếp tục giới thiệu đến bạn thư viện mã Python hữu ích cho các công việc hàng ngày nhé!

Phân tích dữ liệu với lập trình Python From Zero to Hero

Thư viện mã Python hữu ích

Mã Python: Tìm kiếm tệp 

Trong ví dụ này, chúng ta sẽ xây dựng một công cụ tìm kiếm tệp bằng mô-đun Pathlib đơn giản như sau:

from pathlib import Path
 
file_name = input("Filename: ")
folder = "."
folder_answer = input("Folder path (leave empty for the current folder): ")
if folder_answer:
    folder = folder_answer
 
for path in Path(folder).rglob(file_name):
    print(path.absolute())

Chúng ta bắt đầu bằng cách nhập đường dẫn (Path) từ mođun pathlib . Sau đó, bạn nhận được tên tệp để tìm kiếm từ đầu vào của người dùng. Bạn cũng nhận được thư mục để thực hiện tìm kiếm. Trong trường hợp này, giá trị mặc định "." được coi là đại diện cho thư mục hiện tại khi đầu vào của người dùng trống. 

Cuối cùng, bạn sử dụng phương thức .rglob () để tìm kiếm một mẫu tên tệp trong thư mục. Vì rglob () trả về danh sách các đối tượng là đường dẫn để in tất cả các lần xuất hiện của đối tượng nên bạn thực hiện lặp lại danh sách bằng vòng lặp for. Đối với mỗi mục của danh sách, đường dẫn tuyệt đối được lấy bằng phương thức .absolute () và được thể hiện dưới dạng đầu ra. 

Hãy lưu chương trình dưới dạng find_file.py và thực hiện tìm kiếm. Lưu ý rằng bạn có thể sử dụng ký tự đại diện khi nhập tên tệp. Đầu ra sẽ giống như sau:

python find_file.py                         
Filename: find_file.py
Folder path (leave empty for the current folder): 
/home/user/src/find_file.py

Bây giờ, thêm xác thực đầu vào và hỗ trợ cho các đối số dòng lệnh bằng mã sau:

from pathlib import Path
import argparse
 
parser = argparse.ArgumentParser(description="Find file in file system")
 
parser.add_argument(
    "file_name", nargs="?", help="File name (can use wildcards such as *)",
    default=None
)
parser.add_argument(
    "folder", nargs="?", help="Folder (default: current)",
    default=None
)
 
arguments = parser.parse_args()
 
use_arguments_file_name = True if arguments.file_name is not None else False
use_arguments_folder = True if arguments.folder is not None else False
 
# Validation of file name
if use_arguments_file_name:
    file_name = arguments.file_name
else:
    while True:
        file_name = input("Filename: ")
 
        if file_name == "":
            print("Invalid file name")
            continue
        break
 
# Processing of the folder argument
folder = "."
if use_arguments_folder:
    folder = arguments.folder
else:
    folder_answer = input("Folder path (leave empty for the current folder): ")
    if folder_answer:
        folder = folder_answer
 
for path in Path(folder).rglob(file_name):
    print(path.absolute())

Như bạn có thể thấy, mã này đơn giản hơn một chút so với mã từ ví dụ ở phần 1, vì nó chỉ sử dụng hai đối số: tên tệp và thư mục mà chương trình sử dụng tìm kiếm. 

Tên tệp được xác thực để không cho phép giá trị trống khi chương trình chạy ở chế độ tương tác, còn thư mục không sử dụng bất kỳ xác thực nào nhưng nó được coi là một giá trị mặc định. Khi ta thực hiện chạy lệnh cho một thư mục không được sử dụng, nó sẽ hỏi người dùng về thư mục đó và trong trường hợp có phản hồi trống, nó sẽ xem xét giá trị "." là đại diện cho thư mục hiện tại. 

Hãy tiếp tục và lưu các thay đổi vào find_file.py và chạy nó để kiểm tra việc sử dụng giá trị mặc định. Dưới đây là một số bài kiểm tra bạn có thể thử:

python find_file.py file_name /home/user/folder
python find_file.py file_name

Xem thêm: Cách dễ dàng cài đặt và viết chương trình Python đầu tiên của bạn

Mã Python: Xử lý ngày tháng

Trong ví dụ này, bạn sẽ xây dựng một công cụ dòng lệnh để trả về ngày trong tuần. Đối với trường hợp này, chúng sẽ sử dụng môđun Datetime, nằm trong thư viện chuẩn của Python. Mã Python cơ bản như sau:

from datetime import date
 
date_input = input("Enter the date (mm/dd/yyyy): ")
 
date_list = date_input.split("/")
month = int(date_list[0])
day = int(date_list[1])
year = int(date_list[2])
date_date = date(year, month, day)
 
n_day_of_week = date_date.weekday()
 
days_of_week = (
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
    "Sunday",
)
 
day_of_week = days_of_week[n_day_of_week]
print(day_of_week)

Trong ví dụ này, bạn sử dụng datetime.date để thực hiện xử lý và lấy ngày trong tuần cho một ngày nhất định. Bằng cách này, bạn bắt đầu bằng cách nhập nó với từ ngày datetime

Tiếp theo, chúng lấy ngày từ dữ liệu ở định dạng mm / dd / yyyy và thực hiện một số thao tác chuỗi để tách các số nguyên cho tháng, ngày và năm. Với những con số này, bạn bắt đầu khởi tạo một đối tượng ngày có tên date_date

Với đối tượng ngày date_date, tất cả những gì bạn cần làm để có được ngày trong tuần là sử dụng lệnh .weekday (). Nó trả về một số nguyên từ 0 đến 6, trong đó 0 đại diện cho Monday - Thứ Hai và 6 đại diện cho Sunday - Chủ Nhật, được lưu trữ trong biến n_day_of_week

Để chuyển đổi kết quả này thành tên thực của ngày, bạn xác định một loạt chuỗi được gọi là days_of_week, trong đó các chỉ mục từ 0 đến 6 chứa các giá trị từ "Monday - Thứ Hai" đến "Sunday - Chủ Nhật", do đó bạn chỉ cần sử dụng days_of_week [n_day_of_week ] để có được tên trong ngày. Cuối cùng, bạn xuất chuỗi theo ngày trong tuần. 

Tiếp theo hãy lưu chương trình dưới dạng day_of_week.py và chạy nó. Đầu ra sẽ giống như sau:

python day_of_week.py 
Enter the date (mm/dd/yyyy): 01/01/2020
Wednesday

Bây giờ, đã đến lúc hoàn thành chương trình, chúng ta thêm xác thực đầu vào và hỗ trợ cho các đối số. Trong trường hợp này, bạn sẽ xác thực ngày, chương trình được chạy tương tác hay thông qua các đối số dòng lệnh, giống như bạn đã thực hiện với đối số tên tệp hình ảnh trên các ví dụ ở phần 1. Đối với điều đó, bạn có thể sử dụng mã sau:

import argparse
import sys
from datetime import date
 
parser = argparse.ArgumentParser(description="Get day of the week from a date")
 
parser.add_argument("date", nargs="?", help="Date (mm/dd/yyyy)", default=None)
 
arguments = parser.parse_args()
 
use_arguments = True if arguments.date is not None else False
 
while True:
    if use_arguments:
        date_input = arguments.date
    else:
        date_input = input("Enter the date (mm/dd/yyyy): ")
 
    try:
        date_list = date_input.split("/")
        month = int(date_list[0])
        day = int(date_list[1])
        year = int(date_list[2])
 
        date_date = date(year, month, day)
    except:
        print("Invalid date")
        if use_arguments:
            sys.exit()
        continue
 
    break
 
n_day_of_week = date_date.weekday()
 
days_of_week = (
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
    "Sunday",
)
 
day_of_week = days_of_week[n_day_of_week]
print(day_of_week)

Sau khi nhập các thư viện, bạn thiết lập Argparse để chỉ định cấu hình một đối số, được đặt tên là date trong trường hợp này. 

Khi chương trình được chạy bằng đối số dòng lệnh, use_arguments sẽ là True, date_input được lấy thông qua đối số dòng lệnh và vòng lặp bị dừng khi gọi lệnh sys.exit (), trong trường hợp ngày tháng không hợp lệ. 

Lưu các thay đổi vào day_of_week.py và chạy nó để xem nó hoạt động như thế nào. Dưới đây là một số bài kiểm tra bạn có thể thử:

python day_of_week.py 01/01/2020
python day_of_week.py invalid_date

Trong các ví dụ trước, bạn đã làm việc với các đối số trong trường hợp xác thực. Bên cạnh các đối số bạn đã thấy, Argparse cũng có thể được sử dụng để làm việc với các đối số tùy chọn, chúng ta hãy cùng tìm hiểu trong ví dụ tiếp theo. 

Xem thêm: Python - công cụ phân tích dữ liệu phổ biến nhất năm 2021

Mã Python: Tạo mật khẩu ngẫu nhiên 

Trong ví dụ cuối cùng này, bạn sẽ xây dựng một trình tạo mật khẩu ngẫu nhiên. Chương trình sẽ tạo độ dài mật khẩu mong muốn và yêu cầu có sử dụng chữ số hoặc ký tự đặc biệt trong mật khẩu hoặc không. Nó sẽ xuất ra một chuỗi ký tự ngẫu nhiên được sử dụng làm mật khẩu. 

Để hiểu logic chính của chương trình, hãy xem xét cách triển khai đơn giản sau đây:

import random
import string
 
use_digits_answer = input("Use digits [y]/n: ")
if use_digits_answer.lower() == "n":
    use_digits = False
else:
    use_digits = True
 
use_punctuation_answer = input("Use special characters [y]/n: ")
if use_punctuation_answer.lower() == "n":
    use_punctuation = False
else:
    use_punctuation = True
 
password_length_answer = input("Length of the password [10]: ")
if password_length_answer == "":
    password_length = 10
else:
    password_length = int(password_length_answer)
 
letters = string.ascii_letters
digits = string.digits
punctuation = string.punctuation
 
symbols = letters
if use_digits:
    symbols += digits
if use_punctuation:
    symbols += punctuation
 
password = "".join(random.choice(symbols) for i in range(password_length))
print(password)

Trong chương trình này, sau khi nhập các thư viện, bạn sẽ nhận được ba đầu vào từ người dùng: 

  • Có hay không sử dụng các chữ số trong mật khẩu, được lưu trữ trong biến nhị phân use_digits  mặc định là True, trong trường hợp người dùng để trống câu trả lời này. 

  • Có hay không sử dụng các ký tự đặc biệt trong mật khẩu, được lưu trữ trong biến nhị phân use_punctuation  mặc định là True, trong trường hợp người dùng để trống câu trả lời này. 

  • Độ dài của mật khẩu, được lưu trữ trong biến password_length và mặc định là 10, trong trường hợp người dùng để trống câu trả lời này. 

Sau đó là một danh sách các ký hiệu như tên là các ký hiệu được xây dựng dựa trên thông tin được cung cấp, bạn có thể hiểu là bao gồm chữ số hoặc không và bao gồm các ký tự đặc biệt hoặc không. 

Cuối cùng, sử dụng danh sách các ký hiệu này để tạo ngẫu nhiên một ký hiệu cho mỗi ký tự của mật khẩu và nối chúng thành một chuỗi có tên là mật khẩu, được xuất ra dưới dạng đầu ra. 

Lưu tệp dưới dạng gen_password.py. Bạn sẽ nhận được một đầu ra tương tự như sau:

python gen_password.py
Use digits [y]/n: 
Use special characters [y]/n: 
Length of the password [10]: 
6iJx/%J#hq

Bây giờ, theo trình tự tương tự được sử dụng trong các ví dụ trước, bạn sẽ triển khai xác thực đầu vào và hỗ trợ các đối số dòng lệnh. 

Trong ví dụ này, có hai đối số có giá trị nhị phân: có sử dụng chữ số hay không và có sử dụng ký tự đặc biệt hay không. Đối với loại thông tin này, bạn có thể sử dụng các đối số dòng lệnh tùy chọn, các đối số thuộc loại --argument-name

Khi sử dụng các đối số dòng lệnh tùy chọn với các giá trị nhị phân, bạn có thể sử dụng một giá trị mặc định và sử dụng đối số để báo hiệu giá trị đó. Ví dụ: bạn có thể làm cho chương trình sử dụng các chữ số trong mật khẩu theo mặc định và sử dụng đối số "--no-digits - không có chữ số" để thông báo cho người dùng khi họ chưa sử dụng chữ số. 

Theo logic này, chương trình hoàn chỉnh được triển khai bằng đoạn mã sau:

import random
import string
import argparse
 
parser = argparse.ArgumentParser(description="Password generator")
 
parser.add_argument(
    "--no-digits",
    help="generate password without digits",
    action="store_true"
)
 
parser.add_argument(
    "--no-special-chars",
    help="generate password without special characters",
    action="store_true",
)
 
parser.add_argument(
    "length", nargs="?", type=int, help="length of the password", default=None
)
 
arguments = parser.parse_args()
 
use_arguments = True if (arguments.length or
                         arguments.no_digits or
                         arguments.no_special_chars) else False
use_arguments_length = True if arguments.length else False
 
# Process whether or not to use digits
if use_arguments:
    use_digits = not arguments.no_digits
else:
    while True:
        use_digits_answer = input("Use digits [y]/n: ")
        if use_digits_answer.lower() not in ["", "y", "n"]:
            print("Invalid answer")
            continue
        break
 
    if use_digits_answer.lower() == "n":
        use_digits = False
    else:
        use_digits = True
 
# Process whether or not to use special characters
if use_arguments:
    use_punctuation = not arguments.no_special_chars
else:
    while True:
        use_punctuation_answer = input("Use special characters [y]/n: ")
        if use_punctuation_answer.lower() not in ["", "y", "n"]:
            print("Invalid answer")
            continue
        break
 
    if use_punctuation_answer.lower() == "n":
        use_punctuation = False
    else:
        use_punctuation = True
 
# Process the password length
if use_arguments_length:
    password_length = arguments.length
else:
    while True:
        password_length_answer = input("Length of the password [10]: ")
        if password_length_answer == "":
            password_length = 10            
            break
        else:
            try:
                password_length = int(password_length_answer)
            except:
                print("Invalid value")
                continue
            break
 
letters = string.ascii_letters
digits = string.digits
punctuation = string.punctuation
 
symbols = letters
if use_digits:
    symbols += digits
if use_punctuation:
    symbols += punctuation
 
password = "".join(random.choice(symbols) for i in range(password_length))
print(password)

Sau khi nhập các thư viện, bạn đang thiết lập Argparse, xem xét ba đối số: 

  • Đối số tùy chọn --no-digits (không có chữ số), để báo hiệu rằng mật khẩu không được bao gồm các chữ số 

  • Đối số tùy chọn --no-special-chars (không có ký tự đặc biệt), để báo hiệu rằng mật khẩu không được bao gồm các ký tự đặc biệt 

  • Độ dài đối số length, để xác định độ dài của mật khẩu. 

Lưu ý rằng khi xác định các đối số tùy chọn, bạn đang sử dụng action = store_true, trong đó True - để lưu trữ khi đối số được sử dụng và False - khi nó không được sử dụng. 

Ý tưởng trong chương trình này là khi nó được chạy mà không có bất kỳ đối số nào, nó sẽ yêu cầu ba loại thông tin tương tác với nhau. Khi nó được chạy với bất kỳ đối số dòng lệnh nào, chương trình chỉ hỏi độ dài mật khẩu khi nó không được cung cấp. 

Để thực hiện hành động này, bạn tạo hai biến điều khiển: 

  • use_argumentsTrue nếu bất kỳ đối số dòng lệnh nào được sử dụng. 

  • use_arguments_length, True nếu độ dài mật khẩu được chuyển dưới dạng đối số dòng lệnh. 

Trong phần tiếp theo, bạn sử dụng ba đối số để xử lý từng đầu vào. Bạn kiểm tra use_arguments để kiểm soát liệu use_digitsuse_punctuation sẽ được lấy thông qua tương tác hoặc thông qua các đối số dòng lệnh. Tiếp theo, bạn kiểm tra use_arguments_length để kiểm soát việc lấy độ dài của mật khẩu tương tác hay thông qua đối số dòng lệnh. 

Lưu ý rằng, khi chương trình được chạy với phương thức tương tác, bạn xác thực các đầu vào nhị phân bằng cách kiểm tra xem chúng bằng "y", "n" hay giá trị trống để cho biết giá trị mặc định sẽ được sử dụng. 

Cuối cùng, bạn tạo mật khẩu và xuất nó. 

Bây giờ, hãy lưu các thay đổi vào gen_password.py và thử chạy chương trình để xem nó hoạt động như thế nào. Bạn có thể kiểm tra một số cách nhập đối số như sau:

python gen_password.py 15
python gen_password.py --no-digits 15
python gen_password.py --no-digits --no-special-chars 15

Xem thêm: So sánh VBA và Python: Ngôn ngữ nào tốt hơn cho phân tích dữ liệu

Kết luận

Trong bài viết này, bạn đã trải qua quá trình triển khai các ví dụ về mã Python để tạo các mã lệnh cho công việc sử dụng hàng ngày. Bạn đã thấy Argparse rất tiện dụng để triển khai một số lệnh, nó cho phép bạn xây dựng chúng với các thông báo trợ giúp hữu ích và cũng có thể thực hiện xác nhận các đối số. 

Bây giờ bạn đã học được những kiến ​​thức cơ bản về cách triển khai các mã Python, hãy tiếp tục cải thiện kỹ năng của mình bằng cách đọc thêm các bài viết khác về Python của chúng mình nhé! 

0/5 - (0 bình chọn)

0/5 - (0 bình chọn)

0 thảo luận

@ 2020 - Bản quyền của Công ty cổ phần công nghệ giáo dục Gitiho Việt Nam
Giấy chứng nhận Đăng ký doanh nghiệp số: 0109077145, cấp bởi Sở kế hoạch và đầu tư TP. Hà Nội
Giấy phép mạng xã hội số: 588, cấp bởi Bộ thông tin và truyền thông