Skip to main content

How to Generate Random Strings, IDs, and Filenames in Python

This guide explores various methods for generating random strings, alphanumeric strings, unique identifiers (UUIDs), and random filenames in Python. We'll cover using random, string, secrets, uuid, and tempfile modules, explaining when to use each approach, with clear examples and security considerations.

Generating Random Alphanumeric Strings

To generate a random string containing both letters (uppercase and lowercase) and digits:

Using random.choices() (Python 3.6+)

import random
import string

def random_alphanumeric_string(length):
return ''.join(
random.choices(
string.ascii_letters + string.digits, # Combine letters and digits
k=length
)
)
print(random_alphanumeric_string(10)) # Output: e.g., 'VUeFAko53a'
print(random_alphanumeric_string(15)) # Output: e.g., '2AZjmg1mseToJrQ'
  • string.ascii_letters: Provides a string containing all uppercase and lowercase ASCII letters.
  • string.digits: Provides a string containing all digits ('0123456789').
  • random.choices(..., k=length): Selects length random characters from the combined string of letters and digits. This returns a list of characters.
  • ''.join(...): Joins the list of characters into a single string.

Using random.choice (Older Python versions)

random.choices() was introduced in Python 3.6, to support older versions of Python you can use the following approach instead:

import string
import random

def random_alphanumeric_string(length):
return ''.join(
random.choice(string.ascii_lowercase + string.digits)
for _ in range(length)
)
print(random_alphanumeric_string(10)) # Example Output: esi3s7i031
print(random_alphanumeric_string(15)) # Example Output: a5tke88yf4mgr1p
  • This approach uses a generator expression along with random.choice() to pick out the random characters, and the .join() method to form a string.

Cryptographically Secure Random Strings with secrets

If you need random strings for security-sensitive purposes (passwords, tokens, etc.), use the secrets module instead of random:

import string
import secrets # Use secrets for security-sensitive applications

def random_alphanumeric_string_secure(length):
return ''.join(
secrets.choice(string.ascii_letters + string.digits)
for _ in range(length)
)

print(random_alphanumeric_string_secure(10)) # Example Output: zSATuA69UU
print(random_alphanumeric_string_secure(15)) # Example output: FkFOrsWhGdZbRjW
note

secrets.choice() is designed for cryptographic security, unlike random.choice(). Always use secrets for security-related tasks.

Generating Random Strings with Special Characters

To include special characters in your random strings, add string.punctuation:

Using random.choices()

import random
import string

def string_with_special_chars(length):
return ''.join(
random.choices(
string.ascii_lowercase + string.digits + string.punctuation,
k=length
)
)
print(string_with_special_chars(8)) # Output: xp>j&':s
print(string_with_special_chars(6)) # Output: |uu+y&
  • string.punctuation provides a string of common punctuation characters.
  • random.choices is used to construct a random string with the given length.

Using secrets.choice()

For cryptographically secure random strings with special characters:

import string
import secrets

def string_with_special_chars_secure(length):
return ''.join(
secrets.choice(string.ascii_lowercase + string.digits + string.punctuation)
for _ in range(length)
)

print(string_with_special_chars_secure(8)) # Output: :aw+^?!&
print(string_with_special_chars_secure(6)) # Output: 7wn<j3

Generating Unique IDs with uuid

The uuid module provides a standard way to generate universally unique identifiers (UUIDs):

import uuid

unique_id = uuid.uuid4()
print(unique_id) # Output: (e.g.,) 23b11ae7-be3f-490e-8968-1ce63e32f57e
print(unique_id.int) # Output: (e.g.,) 47442562099666614973976298465004811646
print(unique_id.bytes) # Output: (e.g.,) b'#\xb1\x1a\xe7\xbe?I\x0e\x89h\x1c\xe6>2\xf5~'
print(unique_id.hex) # Output: (e.g.,) 23b11ae7be3f490e89681ce63e32f57e
  • uuid.uuid4() generates a random UUID (version 4).
  • UUIDs are 128-bit values, virtually guaranteed to be unique.

UUID as a String

import uuid
unique_id = uuid.uuid4()

unique_id_str = str(unique_id) # Standard UUID format (with hyphens)
print(unique_id_str) # Output: 0c90cd28-2b0b-4bf6-b117-3e0508caee90

UUID as Bytes

import uuid
unique_id = uuid.uuid4()

unique_id_bytes = unique_id.bytes
print(unique_id_bytes) # Output: b'O\xe2\x8a\x9b\xb12B\xc6\x87%\xc6,\n7a\xca'

UUID as an Integer

import uuid
unique_id = uuid.uuid4()

unique_id_int = unique_id.int
print(unique_id_int) # Output: 175004676975893484550870523383656788068

UUID as a Hex String

import uuid
unique_id = uuid.uuid4()

unique_id_hex = unique_id.hex # Hexadecimal representation (no hyphens)
print(unique_id_hex) # Output: 1db9937e0e4e44b0b660a6bd6588013c

Generating Random Filenames

Random Filenames with uuid

Combine uuid and string formatting for random, unique filenames:

import uuid

file_name = str(uuid.uuid4())
print(file_name) # Output: 136ddb62-f3f1-41d3-9e4d-3918f07a8228

file_name = uuid.uuid4().hex
print(file_name) # Output: d2086f18038c408a8bbaebc72339843f
  • You can get a string representation of the uuid object using str(uuid.uuid4()), or a string without dashes using uuid.uuid4().hex.

Temporary Files with Random Names using tempfile

For temporary files, use the tempfile module. This handles creating the file and (optionally) deleting it automatically:

import tempfile

with tempfile.NamedTemporaryFile(mode='w+b', delete=False, prefix='myprefix_', suffix='.txt') as file:
print(file.name) # Output: (e.g.,) /tmp/myprefix_8x7z6p1a.txt
file.write(b"Some data") # Write in bytes mode

# File will be deleted when the with statement is exited,
# only if delete is set to True.
  • If delete=False the file is created and not deleted when it goes out of scope.
  • tempfile.NamedTemporaryFile() creates a temporary file with a (mostly) unique name. The file is created in the system's temporary directory.
  • mode='w+b' opens the file in binary write/read mode. This is generally preferred for temporary files.
  • prefix and suffix arguments control the filename prefix and suffix, offering more predictable names.