X Xerobit

Generate Lorem Ipsum in Python — faker, lorem, and Custom Generators

Generate Lorem Ipsum placeholder text in Python using the faker library, the lorem package, or a custom word-pool generator. Includes scripts for seeding test databases,...

Mian Ali Khalid · · 5 min read
Use the tool
Lorem Ipsum Generator
Generate placeholder text — words, sentences, or paragraphs. Classic lorem ipsum plus alternatives (hipster, cupcake, pirate). HTML-wrapped output option.
Open Lorem Ipsum Generator →

Generating Lorem Ipsum in Python is straightforward with the faker library or the lorem package. Here are practical patterns for test data, database seeding, and fixture generation.

Use the Lorem Ipsum Generator to quickly generate text without writing code.

Quick option: lorem package

pip install lorem
import lorem

# Generate text
word = lorem.word()             # "consectetur"
sentence = lorem.sentence()     # "Lorem ipsum dolor sit amet..."
paragraph = lorem.paragraph()   # Full paragraph
text = lorem.text()             # Multiple paragraphs

# Controlled generation
three_words = ' '.join([lorem.word() for _ in range(3)])
pip install faker
from faker import Faker

fake = Faker()

# Lorem Ipsum style:
paragraph = fake.paragraph(nb_sentences=4)
paragraphs = fake.paragraphs(nb=3)
sentence = fake.sentence(nb_words=8)
sentences = fake.sentences(nb=4)
text = fake.text(max_nb_chars=500)
words = fake.words(nb=6)

# Realistic content:
name = fake.name()              # "Alice Johnson"
email = fake.email()            # "alice@example.com"
address = fake.address()        # Full address
company = fake.company()        # "Acme Corp"
job = fake.job()                # "Software Engineer"
date = fake.date_this_year()    # datetime.date object
url = fake.url()                # "https://example.com/path"

# Locale-specific:
fake_de = Faker('de_DE')
fake_jp = Faker('ja_JP')
german_name = fake_de.name()    # "Hans Müller"

Seed test databases with fake data

from faker import Faker
import sqlite3
from datetime import datetime

fake = Faker()
Faker.seed(42)  # Reproducible results

def seed_database(db_path: str, num_posts: int = 100):
    conn = sqlite3.connect(db_path)
    cur = conn.cursor()

    cur.execute('''
        CREATE TABLE IF NOT EXISTS posts (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            body TEXT NOT NULL,
            author TEXT NOT NULL,
            created_at TEXT NOT NULL,
            published INTEGER DEFAULT 1
        )
    ''')

    posts = [
        (
            fake.sentence(nb_words=6).rstrip('.'),
            '\n\n'.join(fake.paragraphs(nb=4)),
            fake.name(),
            fake.date_time_this_year().isoformat(),
            1
        )
        for _ in range(num_posts)
    ]

    cur.executemany(
        'INSERT INTO posts (title, body, author, created_at, published) VALUES (?,?,?,?,?)',
        posts
    )

    conn.commit()
    conn.close()
    print(f"Seeded {num_posts} posts")

seed_database('test.db', 50)

Generate fixture files for testing

import json
from pathlib import Path
from faker import Faker

fake = Faker()
Faker.seed(0)  # Deterministic output

def generate_blog_fixtures(count: int = 20) -> list[dict]:
    return [
        {
            'id': i + 1,
            'slug': '-'.join(fake.words(4)),
            'title': fake.sentence(nb_words=7).rstrip('.'),
            'excerpt': fake.paragraph(nb_sentences=2),
            'body': '\n\n'.join(fake.paragraphs(nb=5)),
            'author': {
                'name': fake.name(),
                'email': fake.email(),
                'avatar': f'https://api.dicebear.com/7.x/avataaars/svg?seed={i}',
            },
            'tags': fake.words(nb=3),
            'published_at': fake.date_this_decade().isoformat(),
            'reading_minutes': fake.random_int(min=2, max=15),
        }
        for i in range(count)
    ]

fixtures = generate_blog_fixtures(20)
Path('fixtures/posts.json').parent.mkdir(exist_ok=True)
Path('fixtures/posts.json').write_text(json.dumps(fixtures, indent=2))
print(f"Generated {len(fixtures)} post fixtures")

Django: populate dev database

# management/commands/seed_dev.py
from django.core.management.base import BaseCommand
from faker import Faker
from myapp.models import Post, Author

fake = Faker()

class Command(BaseCommand):
    help = 'Seed development database with fake data'

    def add_arguments(self, parser):
        parser.add_argument('--posts', type=int, default=50)

    def handle(self, *args, **options):
        Faker.seed(0)

        # Create authors
        authors = []
        for _ in range(5):
            author, _ = Author.objects.get_or_create(
                email=fake.unique.email(),
                defaults={'name': fake.name()}
            )
            authors.append(author)

        # Create posts
        for i in range(options['posts']):
            Post.objects.create(
                title=fake.sentence(nb_words=6).rstrip('.'),
                body='\n\n'.join(fake.paragraphs(nb=4)),
                author=fake.random_element(authors),
            )

        self.stdout.write(f"Created {options['posts']} posts")
python manage.py seed_dev --posts 100

Custom word-pool generator (no dependencies)

import random

LOREM_WORDS = [
    'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
    'adipiscing', 'elit', 'sed', 'eiusmod', 'tempor', 'incididunt',
    'labore', 'dolore', 'magna', 'aliqua', 'enim', 'veniam',
    'quis', 'nostrud', 'exercitation', 'ullamco', 'laboris',
    'aliquip', 'commodo', 'consequat', 'aute', 'irure',
    'reprehenderit', 'voluptate', 'velit', 'esse', 'cillum',
    'fugiat', 'nulla', 'pariatur',
]

def lorem_sentence(min_words=6, max_words=16) -> str:
    count = random.randint(min_words, max_words)
    words = random.choices(LOREM_WORDS, k=count)
    return words[0].capitalize() + ' ' + ' '.join(words[1:]) + '.'

def lorem_paragraph(min_sentences=3, max_sentences=7) -> str:
    count = random.randint(min_sentences, max_sentences)
    return ' '.join(lorem_sentence() for _ in range(count))

def lorem_text(paragraphs=3) -> str:
    return '\n\n'.join(lorem_paragraph() for _ in range(paragraphs))

print(lorem_text(2))

Related posts

Related tool

Lorem Ipsum Generator

Generate placeholder text — words, sentences, or paragraphs. Classic lorem ipsum plus alternatives (hipster, cupcake, pirate). HTML-wrapped output option.

Written by Mian Ali Khalid. Part of the Dev Productivity pillar.