Python 生成隨機字串的方法總結|密碼、日本語支援與應用範例解說

目次

1. 介紹

在 Python 中處理隨機字串的原因

程式設計中,生成「隨機字串」的場合意外地很多。例如,自動生成使用者的初始密碼、建立唯一識別碼(權杖或 ID)、大量生成測試資料等情況下都會使用。 特別是 Python,以簡單的程式碼就能輕鬆建立此類隨機字串的語言之一。即使只使用標準函式庫,也準備了許多方法,可以根據目的靈活運用。

介紹即使是初學者也能安心使用的實用知識

本文將從 Python 生成隨機字串的基本方法,到更高階且安全的做法,甚至實用的應用範例,都以易懂的方式說明。 此外,不僅是英數字,還會觸及包含日語(平假名・片假名・漢字)的字串生成方法,以及利用外部函式庫建立虛擬資料的內容。 無論是 Python 初學者,還是業務上處理 Python 的中級者,本文都力求提供有參考價值的內容。

閱讀本文能獲得的事項

透過閱讀本文,您可以習得以下技能:
  • 使用 Python 標準函式庫生成隨機字串的方法
  • 注重安全的字串生成最佳實務
  • 包含日語的特殊隨機字串的處理方式
  • 利用 Faker 等外部函式庫生成虛擬資料的方法
  • 隨機字串的實踐應用範例
那麼,讓我們從基本開始,依序來看看使用 Python 生成隨機字串的方法吧。

2. 基本隨機字串的生成方法

使用Python標準函式庫的簡單方法

如果要在Python中生成隨機字串,首先基本的便是random模組與string模組的組合。這些是Python標準內建的,可以不需額外安裝即可使用。 以下是從英數字構成的隨機字串生成的基本範例。
import random
import string

def generate_random_string(length=10):
    characters = string.ascii_letters + string.digits
    return ''.join(random.choice(characters) for _ in range(length))

print(generate_random_string())
此程式碼中,從string.ascii_letters(大小英文字母)與string.digits(0~9的數字)組合的字元集,生成指定長度的隨機字串。

各構成要素的說明

  • string.ascii_lettersabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ(英文字母的大寫・小寫)
  • string.digits0123456789(數字)
  • random.choice():從清單或字串等中隨機選擇一個的函數
  • ''.join(...):將清單的元素結合為一個字串
此方法簡單且非常易用,適合用於輕量腳本或小型實用工具的製作。

可使用任意字元集進行自訂

當然,使用的字元集可以自由自訂。例如,只使用英文字母、只使用數字,或是使用自己定義的字元集,也能輕鬆應對。
def generate_custom_string(length=8):
    characters = 'ABCD1234@#$'
    return ''.join(random.choice(characters) for _ in range(length))

print(generate_custom_string())

隨機性的注意事項

這裡使用的random模組是生成偽隨機數的,並沒有加密學上的強度。因此,在重視安全性的場合(例如密碼生成或API權杖等),下一章介紹的secrets模組更為適合。

3. 進階的隨機字串生成

注重安全的字串生成:secrets模組的活用

處理隨機字串時,根據用途,有時需要「不易預測」且「安全性高」的字串。例如,密碼、認證權杖、API 金鑰等。 Python 中,標準準備了可以生成加密學上安全的亂數secrets模組。
import secrets
import string

def generate_secure_string(length=12):
    characters = string.ascii_letters + string.digits
    return ''.join(secrets.choice(characters) for _ in range(length))

print(generate_secure_string())
這種方法使用secrets.choice()而非random模組,內部採用更安全的亂數演算法。在需要安全性的用途中,請務必使用此方法。

包含符號或特殊字元的隨機字串

如果需要更複雜的字串,可以包含符號或特殊字元(!@#%&*等),來生成強度更高的隨機字串。
def generate_complex_password(length=16):
    characters = string.ascii_letters + string.digits + string.punctuation
    return ''.join(secrets.choice(characters) for _ in range(length))

print(generate_complex_password())
  • string.punctuation:包含!"#$%&'()*+,-./:;<=>?@[]^_{|}~`等符號。
  • 輸出的字串具有與密碼生成工具同等以上的強度。

包含日語(平假名・片假名・漢字)的隨機字串生成

不僅是英數字,有時也需要處理包含日語的隨機字串。例如,生成測試用的日語資料等。

平假名・片假名的情況

以下是從平假名生成隨機字串的範例。
import random

hiragana = [chr(code) for code in range(12353, 12436) if chr(code).isalpha()]

def generate_hiragana_string(length=8):
    return ''.join(random.choice(hiragana) for _ in range(length))

print(generate_hiragana_string())
這種方法從 Unicode 的平假名範圍(U+3041~U+3096)提取字元。

漢字的情況(注意事項)

漢字的 Unicode 範圍很廣,容易混入無意義的字元,因此像以下事先準備的漢字清單中選擇較為安全。
kanji_list = ['山', '川', '田', '本', '中', '村', '花', '木']

def generate_kanji_string(length=4):
    return ''.join(random.choice(kanji_list) for _ in range(length))

print(generate_kanji_string())
如果需要實用的資料,通常會基於市售的常用漢字清單或人名漢字清單來自訂。

總結:需要進階生成的場景是什麼?

用途範例推薦模組字元種類
使用者名稱的自動生成random僅英數字
密碼生成secrets英數字 + 符號
測試用日語字串random平假名・片假名・漢字
權杖・API 金鑰secrets高強度英數字 or 自訂集合
根據目的,區分使用模組或字元集合,即可生成更安全且實用的隨機字串。

4. 使用外部程式庫產生隨機資料

產生虛擬資料很方便的 Faker 程式庫

Python 雖然也能用標準程式庫處理隨機字串,但如果想產生更真實且有意義的「虛擬資料(像是虛構的名字或地址等)」,Faker 這個外部程式庫就非常方便了。 Faker 能隨機產生名字、地址、電話號碼、電子郵件地址等,是開發、測試、展示用途的最佳選擇。

Faker 的安裝方法

首先安裝 Faker 吧。在終端機執行以下指令。
pip install faker

基本用法(英文資料)

以下是使用 Faker 產生英文名字或電子郵件地址的範例。
from faker import Faker

fake = Faker()

print(fake.name())       # 範例: John Doe
print(fake.email())      # 範例: johndoe@example.com
print(fake.address())    # 範例: 1234 Elm Street, Springfield
就這樣,就能輕鬆建立看起來真實的虛擬資料。

如何產生日文資料?

Faker 支援多語言,也能輕鬆產生日文資料。要這麼做,需要指定 ja_JP 這個地區設定(locale)。
from faker import Faker

fake = Faker('ja_JP')

print(fake.name())       # 範例: Yamada Tarō
print(fake.address())    # 範例: 東京都港区南青山1-2-3
print(fake.company())    # 範例: 株式会社サンプル
這樣,就能自動產生日文的虛擬名字、地址等資料。

Faker 也能產生隨機字串嗎?

是的,Faker 具備 lexify()bothify() 等便利方法,能依特定模式產生英數字混合的隨機字串
print(fake.lexify(text="????-????"))     # 範例: xqwe-kdls
print(fake.bothify(text="##??-??##"))    # 範例: 45az-kl92
  • ? → 隨機英文字母(a-z)
  • # → 隨機數字(0-9)
這樣,就能輕鬆建立像是「商品代碼」或「會員編號」等結構化字串。

使用 Faker 的批次資料產生(CSV 儲存範例)

Faker 能自動產生大量虛擬資料,並輕鬆輸出到 CSV 檔案等。
import csv
from faker import Faker

fake = Faker('ja_JP')

with open('dummy_users.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['名字', '電子郵件', '地址'])

    for _ in range(10):
        writer.writerow([fake.name(), fake.email(), fake.address()])
這段程式碼會以 CSV 格式輸出 10 筆日文使用者資料。對於開發中的 Web 應用程式等測試非常有用。

Faker 什麼時候使用?

使用目的活用範例
測試用使用者資料建立自動產生名字・電子郵件・地址等
前端 UI 確認用虛假資料顯示清單或表格
負載測試或大量資料產生也能批次產生數百~數萬筆
展示網站的建置用不存在的個人資訊符合合規性

5. 實踐性的應用範例

使用者名稱或初始密碼的自動生成

Web 服務或業務應用程式中,在使用者註冊時經常會發行臨時 ID 或初始密碼。如果應用隨機字串生成的基礎,就能自動且安全地生成這些資訊。
import secrets
 import string
 
 def generate_user_credentials():
     user_id = ''.join(secrets.choice(string.ascii_lowercase + string.digits) for _ in range(8))
     password = ''.join(secrets.choice(string.ascii_letters + string.digits + string.punctuation) for _ in range(12))
     return user_id, password
 
 user_id, password = generate_user_credentials()
 print(f"使用者 ID: {user_id}")
 print(f"初始密碼: {password}")
這樣就能輕鬆建立不易重複且強度高的資訊

作為測試資料的使用

開發中進行表單或資料庫動作確認時,經常需要假的姓名、地址、商品代碼等。在這種情況下,結合 Faker 函式庫或日文字串的生成方法,一次生成逼真的測試資料會很方便。
  • 使用者清單畫面的顯示測試
  • 篩選功能或搜尋功能的確認
  • 輸入驗證的確認
因為能以接近實際運營資料的形式進行測試,所以錯誤偵測的精度會提高。

唯一 ID 的生成(權杖、金鑰、識別子)

為每個使用者發行的 API 金鑰或工作階段 ID 等,「不能與他人重複」的隨機字串 需要的場面,Python 也能發揮作用。
import secrets
 
 def generate_token(length=32):
     return secrets.token_hex(length)
 
 print(generate_token())  # 範例: '2f6c3b8f2deabfa479b1c61a3e5a9a3f...'
  • secrets.token_hex() 會生成加密學上安全的16進位字串。
  • 最適於使用者個別的認證權杖或 API 金鑰的生成。

也能應用於日文對應的應用程式

例如,需要以平假名・片假名自動輸入姓名的表單測試,或需要輸入漢字的搜尋功能動作確認,也能使用平假名・漢字的隨機生成腳本來幫助。
import random
 
 katakana = [chr(code) for code in range(12449, 12532) if chr(code).isalpha()]
 
 def generate_katakana_name(length=5):
     return ''.join(random.choice(katakana) for _ in range(length))
 
 print(generate_katakana_name())  # 範例: サミョツハラ
這樣的腳本,能貢獻於前端・後端的品質確認

還有這些活用!

活用場景具體範例
程式設計學習最適於字串處理・正規表示式的練習
遊戲開發用於角色名稱或代碼生成
測驗・拼圖活用隨機字串或模式於出題
加密技術的實驗與加密・雜湊的組合驗證

6. 總結

在 Python 中自由運用隨機字串的能力

這篇文章以「Python 隨機字串」為主題,從基本的生成方法到實踐性的應用範例,廣泛地進行了解說。 Python 透過活用標準函式庫和外部函式庫,能夠簡單且靈活地生成隨機字串,是一種強大的語言。特別是掌握以下要點的話,就能在大多數開發場景中派上用場。

回顧各章要點

  • 基本生成方法中,介紹了使用 random 模組和 string 模組的簡單方法。
  • 安全性用途中,說明了加密學上安全的 secrets 模組是必不可少的。
  • 處理日文字串時,使用 Unicode 或預定義清單的技巧很有效。
  • 活用Faker 函式庫,就能輕鬆生成姓名、地址、電子郵件等真實的虛擬資料。
  • 實踐性活用中,介紹了使用者認證、測試資料生成、權杖發行等具體範例。

隨機字串生成中的注意事項

  • random 模組雖然簡單,但由於可預測性,因此不適合用於安全性目的。
  • 生成包含符號或特殊字元的字串時,需要意識到使用場合(例如:需要 URL 編碼的場面等)。
  • 日文字串的隨機生成中,需要理解會產生無意義的字串,因此基本限定於測試用途。
  • Faker 的資料是純粹虛構的資訊,與真實人物・企業無關。

連結到未來學習的提示

  • 結合正規表達式,挑戰字串模式的驗證或篩選。
  • 組み入 GUI 應用程式或 Web 表單,製作使用者導向的字串自動生成功能。
  • 與其他函式庫(NumPy 或 Pandas)聯動,建構大量的測試資料集。
Python 中的隨機字串生成,不僅是單純的技巧,而是支撐各種系統或專案的重要基礎技術。請務必將這篇文章學到的內容,應用到自己的開發或學習中。 下一章將彙整「常見問題(FAQ)」。將仔細回答讀者容易產生疑問的點,請陪伴到最後。

7. 常見問題(FAQ)

本章中,我們以問答形式彙整了讀者在使用 Python 生成隨機字串時經常提出的問題及其解答。

Q1. random 模組與 secrets 模組的差異是什麼?

A1.random 是用來生成偽隨機數的模組,適合用於可重現的資料或輕量級處理。另一方面,secrets 是能生成加密學上安全的隨機數的模組,適合用於安全性重要的用途,如密碼或權杖。
模組特點主要用途
random高速・輕量測試・簡易資料生成
secrets不可預測密碼・API 金鑰・認證權杖

Q2. 可以只使用特定字元來製作隨機字串嗎?

A2.是的,可以。例如使用「ABC123」等自行定義的任意字元集,即可從中隨機選擇字元。
import random

chars = 'ABC123'
print(''.join(random.choice(chars) for _ in range(6)))
這有助於商品代碼或使用者 ID 的生成等。

Q3. 如何製作隨機的日文(平假名或漢字)字串?

A3.平假名或片假名可以使用 Unicode 字元碼輕鬆隨機化。漢字由於可能混入無意義的字元,因此以下方式從預先準備的漢字清單中選擇較為安全。
# 平假名範例
hiragana = [chr(i) for i in range(12353, 12436)]
print(''.join(random.choice(hiragana) for _ in range(5)))

Q4. 我想使用 Faker 生成日文資料,該怎麼做?

A4.Faker 支援多語言,要生成日文資料只需指定 ja_JP 地區設定即可。
from faker import Faker

fake = Faker('ja_JP')
print(fake.name())     # 範例: Suzuki Tarō
可以自動生成姓名、地址、公司名稱、電話號碼等日文資料。

Q5. 如何動態變更隨機字串的長度?

A5.如果將長度(length)傳入函數的引數,即可生成任意長度的隨機字串。以下是典型的範例。
def generate_random_string(length=8):
    return ''.join(random.choice('ABC123') for _ in range(length))

print(generate_random_string(12))  # 長度 12 的字串

Q6. Faker 的資料是真實人物的嗎?

A6.不是,Faker 生成的姓名、地址等資訊皆為虛構資料。無個人資訊外洩風險,可安全用於測試或示範用途。

Q7. 為什麼每次執行都會得到相同結果?

A7.使用 random.seed() 固定亂數的初始值,即可得到可重現的輸出。相反地,若想每次都得到不同的結果,則一般不指定 seed(),或使用系統時間。
import random
random.seed(42)  # 會得到相同結果
以上是使用 Python 生成隨機字串時的常見問題及其解答。 在實踐過程中若有「為什麼會這樣?」的疑問時,本 FAQ 一定會很有幫助。
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール