Main Automate the Boring Stuff with Python, 2nd Edition: Practical Programming for Total Beginners

Automate the Boring Stuff with Python, 2nd Edition: Practical Programming for Total Beginners

The second edition of this best-selling Python book (100,000+ copies sold in print alone) uses Python 3 to teach even the technically uninclined how to write programs that do in minutes what would take hours to do by hand. There is no prior programming experience required and the book is loved by liberal arts majors and geeks alike.

If you've ever spent hours renaming files or updating hundreds of spreadsheet cells, you know how tedious tasks like these can be. But what if you could have your computer do them for you?

In this fully revised second edition of the best-selling classic Automate the Boring Stuff with Python, you'll learn how to use Python to write programs that do in minutes what would take you hours to do by hand--no prior programming experience required. You'll learn the basics Python and explore Python's rich library of modules for performing specific tasks, like scraping data off websites, reading PDF and Word documents, and automating clicking and typing tasks.

The second edition of this international fan favorite includes a brand-new chapter on input validation, as well as tutorials on automating Gmail and Google Sheets, plus tips on automatically updating CSV files. You'll learn how to create programs that effortlessly perform useful feats of automation to:

- Search for text in a file or across multiple files
- Create, update, move, and rename files and folders
- Search the Web and download online content
- Update and format data in Excel spreadsheets of any size
- Split, merge, watermark, and encrypt PDFs
- Send email responses and text notifications
- Fill out online forms

Step-by-step instructions walk you through each program, and updated practice projects at the end of each chapter challenge you to improve those programs and use your newfound skills to automate similar tasks.

Don't spend your time doing work a well-trained monkey could do. Even if you've never written a line of code, you can make your computer do the grunt work. Learn how inAutomate the Boring Stuff with Python, 2nd Edition.
Year: 2019
Edition: Paperback
Publisher: No Starch Press
Language: english
Pages: 592 / 594
ISBN 10: 1593279922
ISBN 13: 9781593279929
File: PDF, 13.74 MB
Download (pdf, 13.74 MB)
Preview

You may be interested in

 

Python Crash Course, 2nd Edition

Year: 2019
Language: english
File: EPUB, 5.50 MB

Most frequently terms

 
 
kukluklu
THIS IS SOOOOOOOOOOOOOOOOOOO DOPE
01 December 2019 (22:25) 
You can write a book review and share your experiences. Other readers will always be interested in your opinion of the books you've read. Whether you've loved the book or not, if you give your honest and detailed thoughts then people will find new books that are right for them.
2ND EDITION
LEARN PYTHON.
GET STUFF DONE.

OVER 200,000
COPIES SOLD

• Search the web and download online content

In this fully revised second edition of Automate the
Boring Stuff with Python, you’ll learn how to use Python
to write programs that do in minutes what would take
you hours to do by hand—no prior programming experience required. You’ll learn the basics of Python and
explore Python’s rich library of modules for performing
specific tasks, like scraping data off websites, reading
PDF and Word documents, and automating clicking and
typing tasks.

• Fill out online forms

The second edition of this international best-seller
includes a brand-new chapter on input validation,
as well as tutorials on automating Gmail and Google
Sheets, and tips on automatically updating CSV files.
You’ll learn how to create programs that effortlessly
perform useful feats of automation to:
• Search for text in a file or across multiple files
• Create, update, move, and rename files and folders

• Split, merge, watermark, and encrypt PDFs
• Send email responses and text notifications

Step-by-step instructions walk you through each program,
and updated practice projects at the end of each chapter
challenge you to improve those programs and use your
newfound skills to automate similar tasks.
Don’t spend your time doing work a well-trained monkey
could do. Even if you’ve never written a line of code,
you can make your computer do the grunt work. Learn
how in Automate the Boring Stuff with Python.
ABOUT THE AUTHOR

Al Sweigart is a professional software developer who
teaches programming to kids and adults. Sweigart
has written several bestselling programming books
for beginners, including Invent Your Own Computer
Games with Python, Cracking Codes with Python, and
Coding with Minecraft (all from No Starch Press).

COVERS PYTHON 3.X

$39.95 ($53.95 CDN)
SHELVE IN:
PROGRAMMING LANGUAGES/
PYTHON

SWEIGART

T H E F I N E ST I N G E E K E N T E RTA I N M E N T ™
w w w.nostarch.com

AU TOM AT E T HE BOR ING
STUFF WITH PY THON

If you’ve ever spent hours renaming files or updating
hundreds of spreadsheet cells, you know how tedious
tasks like these can be. But what if you could have your
computer do them for you?

2ND EDITION

AUTOMATE
THE BORING STUFF
WITH PYTHON
P R A C T I C A L

P R O G R A M M I N G
F O R T O T A L B E G I N N E R S
AL SWEIGART

AUTOMATE THE BORING STUFF
WITH PYTHON

AUTOMATE THE
BORING STUFF
WITH PYTHON
2ND EDITION
Practical Programming
for Total Beginners

b y Al S w e i g a r t

San Francisco

AUTOMATE THE BORING STUFF WITH PYTHON, 2ND EDITION. Copyright © 2020 by Al Sweigart.
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.

ISBN-10: 1-59327-992-2
ISBN-13: 978-1-59327-992-9
Publisher: William Pollock
Production Editor: Laurel Chun
Cover Illustration: Josh Ellingson
Interior Design: Octopod Studios
Developmental Editors: Frances Saux and Jan Cash
Technical Reviewers: Ari Lacenski and Philip James
Copyeditors: Kim Wimpsett, Britt Bogan, and Paula L. Fleming
Compositors: Susan Glinert Stevens and Danielle Foster
Proofreaders: Lisa Devoto Farrell and Emelie Burnette
Indexer: BIM Indexing and Proofreading Services
For information on distribution, translations, or bulk sales,
please contact No Starch Press, Inc. directly:
No Starch Press, Inc.
245 8th Street, San Francisco, CA 94103
phone: 1.415.863.9900; info@nostarch.com
www.nostarch.com
The Library of Congress Control Number for the first edition is: 2014953114
No Starch Press and the No Starch Press logo are registered trademarks of No Starch Press, Inc. Other
product and company names mentioned herein may be the trademarks of their respective owners. Rather
than use a trademark symbol with every occurrence of a trademarked name, we are using the names only
in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The information in this book is distributed on an “As Is” basis, without warranty. While every precaution
has been taken in the preparation of this work, neither the author nor No Starch Press, Inc. shall have any
liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or
indirectly by the information contained in it.
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 United
States License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/us/ or
send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

For my nephew Jack

About the Author
Al Sweigart is a software developer and tech book author. Python is his
favorite programming language, and he is the developer of several open
source modules for it. His other books are freely available under a Creative
Commons license on his website https://inventwithpython.com/. His cat now
weighs 11 pounds.

About the Tech Reviewer
Philip James has been working in Python for over a decade and is a frequent
speaker in the Python community. He speaks on topics ranging from Unix
fundamentals to open source social networks. Philip is a Core Contributor to
the BeeWare project and lives in the San Francisco Bay Area with his partner
Nic and her cat River.

BRIEF CONTENTS

Acknowledgments .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . xxv
Introduction  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . xxvii

PART I: PYTHON PROGRAMMING BASICS
Chapter 1: Python Basics .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 3
Chapter 2: Flow Control  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 21
Chapter 3: Functions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 57
Chapter 4: Lists .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 77
Chapter 5: Dictionaries and Structuring Data .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 111
Chapter 6: Manipulating Strings .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 129

PART II: AUTOMATING TASKS
Chapter 7: Pattern Matching with Regular Expressions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 161
Chapter 8: Input Validation  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 187
Chapter 9: Reading and Writing Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 201
Chapter 10: Organizing Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 231
Chapter 11: Debugging .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 249
Chapter 12: Web Scraping .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 267
Chapter 13: Working with Excel Spreadsheets .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 301
Chapter 14: Working with Google Sheets .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 329
Chapter 15: Working with PDF and Word Documents .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 347
Chapter 16: Working with CSV Files and JSON Data .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 371
Chapter 17: Keeping Time, Scheduling Tasks, and Launching Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  . 389
Chapter 18: Sending Email and Text Messages  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 415

Chapter 19: Manipulating Images  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 447
Chapter 20: Controlling the Keyboard and Mouse with GUI Automation .  .  .  .  .  .  .  .  .  .  .  .  .  . 473
Appendix A: Installing Third-Party Modules  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 507
Appendix B: Running Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 511
Appendix C: Answers to the Practice Questions  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 517
Index .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 531

viii   Brief Contents

CONTE NT S IN DE TA IL
ACKNOWLEDGMENTS

xxv

INTRODUCTION

xxvii

Whom Is This Book For?  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Conventions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
What Is Programming?  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
What Is Python? .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Programmers Don’t Need to Know Much Math  .
You Are Not Too Old to Learn Programming .  .  .
Programming Is a Creative Activity .  .  .  .  .  .  .  .  .  .
About This Book .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Downloading and Installing Python .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Downloading and Installing Mu  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Starting Mu  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Starting IDLE .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The Interactive Shell .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Installing Third-Party Modules .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
How to Find Help .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Asking Smart Programming Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 . xxviii
 . xxviii
 .  . xxix
 .  .  . xxx
 .  .  . xxx
 .  . xxxi
 .  . xxxi
 .  . xxxi
 . xxxiii
 . xxxiv
 . xxxiv
 .  . xxxv
 .  . xxxv
 . xxxvi
 . xxxvi
 . xxxviii
 . xxxix

PART I: PYTHON PROGRAMMING BASICS
1
PYTHON BASICS
Entering Expressions into the Interactive Shell .  .  .  .
The Integer, Floating-Point, and String Data Types .
String Concatenation and Replication  .  .  .  .  .  .  .  .  .
Storing Values in Variables  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Assignment Statements .  .  .  .  .  .  .  .  .  .  .  .  .
Variable Names  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Your First Program .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Dissecting Your Program  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Comments .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The print() Function .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The input() Function  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Printing the User’s Name .  .  .  .  .  .  .  .  .  .  .  .
The len() Function .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The str(), int(), and float() Functions .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

3
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 . 4
 . 7
 . 7
 . 9
 . 9
10
11
13
13
13
14
14
14
15
18
19

2
FLOW CONTROL
Boolean Values .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Comparison Operators  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Boolean Operators .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Binary Boolean Operators .  .  .  .  .  .  .  .  .  .  .  .
The not Operator .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Mixing Boolean and Comparison Operators  .  .  .  .  .
Elements of Flow Control .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Conditions  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Blocks of Code  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Program Execution  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Flow Control Statements .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
if Statements  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
else Statements  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
elif Statements .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
while Loop Statements  .  .  .  .  .  .  .  .  .  .  .  .  .  .
break Statements .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
continue Statements  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
for Loops and the range() Function .  .  .  .  .  .
Importing Modules  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
from import Statements .  .  .  .  .  .  .  .  .  .  .  .  .  .
Ending a Program Early with the sys.exit() Function .
A Short Program: Guess the Number .  .  .  .  .  .  .  .  .  .  .
A Short Program: Rock, Paper, Scissors .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

21
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

3
FUNCTIONS
def Statements with Parameters .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Define, Call, Pass, Argument, Parameter .  .  .  .  .  .  .  .  .  .  .  .  .  .
Return Values and return Statements  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The None Value .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Keyword Arguments and the print() Function .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The Call Stack  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Local and Global Scope  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Local Variables Cannot Be Used in the Global Scope .  .  .  .  .
Local Scopes Cannot Use Variables in Other Local Scopes .
Global Variables Can Be Read from a Local Scope .  .  .  .  .  .
Local and Global Variables with the Same Name  .  .  .  .  .  .  .
The global Statement .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Exception Handling .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
A Short Program: Zigzag .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

x   Contents in Detail

22
23
25
25
26
26
27
27
27
28
28
28
29
30
35
39
40
44
47
48
49
49
51
55
55

57
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

59
59
60
61
62
63
65
66
67
67
68
68
71
72
75
75

Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 76
The Collatz Sequence .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 76
Input Validation .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 76

4
LISTS
The List Data Type .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting Individual Values in a List with Indexes  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Negative Indexes .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting a List from Another List with Slices .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting a List’s Length with the len() Function .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Changing Values in a List with Indexes .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
List Concatenation and List Replication .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Removing Values from Lists with del Statements .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Working with Lists .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Using for Loops with Lists  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The in and not in Operators  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The Multiple Assignment Trick  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Using the enumerate() Function with Lists .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Using the random.choice() and random.shuffle() Functions with Lists .
Augmented Assignment Operators  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Methods  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Finding a Value in a List with the index() Method .  .  .  .  .  .  .  .  .  .  .  .  .  .
Adding Values to Lists with the append() and insert() Methods .  .  .  .  .
Removing Values from Lists with the remove() Method  .  .  .  .  .  .  .  .  .  .
Sorting the Values in a List with the sort() Method .  .  .  .  .  .  .  .  .  .  .  .  .  .
Reversing the Values in a List with the reverse() Method  .  .  .  .  .  .  .  .  .
Example Program: Magic 8 Ball with a List .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sequence Data Types  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Mutable and Immutable Data Types .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The Tuple Data Type .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Converting Types with the list() and tuple() Functions .  .  .  .  .  .  .  .  .  .  .  .
References .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Identity and the id() Function .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Passing References .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The copy Module’s copy() and deepcopy() Functions  .  .  .  .  .  .  .  .  .  .  .
A Short Program: Conway’s Game of Life  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Comma Code .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Coin Flip Streaks .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Character Picture Grid .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

5
DICTIONARIES AND STRUCTURING DATA

77
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 . 78
 . 78
 . 80
 . 80
 . 81
 . 81
 . 81
 . 82
 . 82
 . 84
 . 84
 . 85
 . 86
 . 86
 . 87
 . 88
 . 88
 . 89
 . 90
 . 90
 . 91
 . 92
 . 93
 . 94
 . 96
 . 97
 . 97
 . 99
100
101
102
106
106
107
107
107
108

111

The Dictionary Data Type .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 111
Dictionaries vs. Lists .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 112
The keys(), values(), and items() Methods . . . . . . . . . . . . . . . . . . . . . . . . . . 114

Contents in Detail   xi

Checking Whether a Key or Value Exists in a Dictionary .
The get() Method .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The setdefault() Method .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Pretty Printing .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Using Data Structures to Model Real-World Things  .  .  .  .  .  .  .  .  .  .  .
A Tic-Tac-Toe Board .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Nested Dictionaries and Lists .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Chess Dictionary Validator  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Fantasy Game Inventory .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
List to Dictionary Function for Fantasy Game Inventory  .  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

6
MANIPULATING STRINGS
Working with Strings .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
String Literals .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Indexing and Slicing Strings  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The in and not in Operators with Strings .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Putting Strings Inside Other Strings  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Useful String Methods .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The upper(), lower(), isupper(), and islower() Methods  .  .  .  .  .  .  .  .  .  .
The isX() Methods .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The startswith() and endswith() Methods  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The join() and split() Methods .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Splitting Strings with the partition() Method .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Justifying Text with the rjust(), ljust(), and center() Methods .  .  .  .  .  .  .  .
Removing Whitespace with the strip(), rstrip(), and lstrip() Methods  .
Numeric Values of Characters with the ord() and chr() Functions .  .  .  .  .  .  .  .  .  .
Copying and Pasting Strings with the pyperclip Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Multi-Clipboard Automatic Messages .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Program Design and Data Structures .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Handle Command Line Arguments  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Copy the Right Phrase .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Adding Bullets to Wiki Markup .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Copy and Paste from the Clipboard  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Separate the Lines of Text and Add the Star .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Join the Modified Lines  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
A Short Progam: Pig Latin  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Table Printer  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Zombie Dice Bots .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

xii   Contents in Detail

115
116
116
118
119
120
125
126
126
127
127
127
128

129
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

130
130
132
133
134
134
135
136
138
138
140
140
142
143
143
144
144
145
146
147
147
148
148
149
153
153
154
154
155

PART II: AUTOMATING TASKS
7
PATTERN MATCHING WITH REGULAR EXPRESSIONS
Finding Patterns of Text Without Regular Expressions .  .  .  .  .  .  .  .  .  .
Finding Patterns of Text with Regular Expressions  .  .  .  .  .  .  .  .  .  .  .  .
Creating Regex Objects  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Matching Regex Objects  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Review of Regular Expression Matching  .  .  .  .  .  .  .  .  .  .  .  .
More Pattern Matching with Regular Expressions  .  .  .  .  .  .  .  .  .  .  .  .
Grouping with Parentheses .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Matching Multiple Groups with the Pipe .  .  .  .  .  .  .  .  .  .  .  .
Optional Matching with the Question Mark .  .  .  .  .  .  .  .  .  .
Matching Zero or More with the Star .  .  .  .  .  .  .  .  .  .  .  .  .  .
Matching One or More with the Plus  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Matching Specific Repetitions with Braces .  .  .  .  .  .  .  .  .  .  .
Greedy and Non-greedy Matching .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The findall() Method  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Character Classes .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Making Your Own Character Classes .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The Caret and Dollar Sign Characters .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The Wildcard Character  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Matching Everything with Dot-Star  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Matching Newlines with the Dot Character .  .  .  .  .  .  .  .  .  .
Review of Regex Symbols .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Case-Insensitive Matching  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Substituting Strings with the sub() Method .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Managing Complex Regexes .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Combining re.IGNORECASE, re.DOTALL, and re.VERBOSE .  .  .  .  .
Project: Phone Number and Email Address Extractor .  .  .  .  .  .  .  .  .  .
Step 1: Create a Regex for Phone Numbers  .  .  .  .  .  .  .  .  .
Step 2: Create a Regex for Email Addresses .  .  .  .  .  .  .  .  .
Step 3: Find All Matches in the Clipboard Text  .  .  .  .  .  .  .
Step 4: Join the Matches into a String for the Clipboard .
Running the Program  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Date Detection .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Strong Password Detection  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Regex Version of the strip() Method  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

8
INPUT VALIDATION

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

161
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

162
164
165
165
166
166
166
168
168
169
170
170
171
171
172
173
174
175
175
176
177
177
178
178
179
179
180
181
182
183
183
183
184
184
186
186
186
186

187

The PyInputPlus Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 188
The min, max, greaterThan, and lessThan Keyword Arguments  .  .  .  .  .  .  .  .  .  .  . 190
The blank Keyword Argument .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 191

Contents in Detail   xiii

The limit, timeout, and default Keyword Arguments  .  .  .  .  .  .
The allowRegexes and blockRegexes Keyword Arguments  .
Passing a Custom Validation Function to inputCustom() .  .  .  .
Project: How to Keep an Idiot Busy for Hours .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Multiplication Quiz  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sandwich Maker .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Write Your Own Multiplication Quiz  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

9
READING AND WRITING FILES
Files and File Paths .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Backslash on Windows and Forward Slash on macOS and Linux  .
Using the / Operator to Join Paths .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The Current Working Directory  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The Home Directory .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Absolute vs. Relative Paths  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating New Folders Using the os.makedirs() Function  .  .  .  .  .  .  .  .
Handling Absolute and Relative Paths .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting the Parts of a File Path .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Finding File Sizes and Folder Contents .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Modifying a List of Files Using Glob Patterns .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Checking Path Validity .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The File Reading/Writing Process .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Opening Files with the open() Function .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Reading the Contents of Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Writing to Files  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Saving Variables with the shelve Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Saving Variables with the pprint.pformat() Function .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Generating Random Quiz Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Store the Quiz Data in a Dictionary . . . . . . . . . . . . . . . .
Step 2: Create the Quiz File and Shuffle the Question Order .  .  .  .  .
Step 3: Create the Answer Options  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 4: Write Content to the Quiz and Answer Key Files  .  .  .  .  .  .  .
Project: Updatable Multi-Clipboard .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Comments and Shelf Setup .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Save Clipboard Content with a Keyword .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: List Keywords and Load a Keyword’s Content .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Extending the Multi-Clipboard .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Mad Libs .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Regex Search  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

xiv   Contents in Detail

191
192
193
194
196
197
198
198
198
199

201
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

201
202
204
205
206
206
207
208
209
212
213
214
215
217
217
218
219
220
221
222
223
224
225
226
227
227
228
229
229
229
229
230
230

10
ORGANIZING FILES

231

The shutil Module  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Copying Files and Folders .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Moving and Renaming Files and Folders .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Permanently Deleting Files and Folders .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Safe Deletes with the send2trash Module  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Walking a Directory Tree .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Compressing Files with the zipfile Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Reading ZIP Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Extracting from ZIP Files  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating and Adding to ZIP Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Renaming Files with American-Style Dates to European-Style Dates  .
Step 1: Create a Regex for American-Style Dates .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Identify the Date Parts from the Filenames  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Form the New Filename and Rename the Files .  .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Backing Up a Folder into a ZIP File  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Figure Out the ZIP File’s Name .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Create the New ZIP File .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Walk the Directory Tree and Add to the ZIP File .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Selective Copy .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Deleting Unneeded Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Filling in the Gaps .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

11
DEBUGGING
Raising Exceptions  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting the Traceback as a String .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Assertions  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Using an Assertion in a Traffic Light Simulation  .
Logging .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Using the logging Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Don’t Debug with the print() Function  .  .  .  .  .  .  .  .
Logging Levels .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Disabling Logging  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Logging to a File  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Mu’s Debugger .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Continue .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step In  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step Over .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step Out .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Stop  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

232
232
233
234
235
235
237
238
238
239
240
240
241
242
243
243
243
245
245
246
246
247
247
247
247
248

249
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

250
251
253
254
255
256
257
258
259
259
260
261
261
261
261
261

Contents in Detail   xv

Debugging a Number
Breakpoints .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .
Practice Project .  .  .  .  .  .  .  .  .  .  .  .
Debugging Coin Toss .

Adding Program  .
 .  .  .  .  .  .  .  .  .  .  .  .  .
 .  .  .  .  .  .  .  .  .  .  .  .  .
 .  .  .  .  .  .  .  .  .  .  .  .  .
 .  .  .  .  .  .  .  .  .  .  .  .  .
 .  .  .  .  .  .  .  .  .  .  .  .  .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .

12
WEB SCRAPING
Project: mapIt.py with the webbrowser Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Figure Out the URL  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Handle the Command Line Arguments .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Handle the Clipboard Content and Launch the Browser .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Downloading Files from the Web with the requests Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Downloading a Web Page with the requests.get() Function .  .  .  .  .  .  .  .  .  .  .
Checking for Errors  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Saving Downloaded Files to the Hard Drive .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
HTML .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Resources for Learning HTML  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
A Quick Refresher  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Viewing the Source HTML of a Web Page .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Opening Your Browser’s Developer Tools .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Using the Developer Tools to Find HTML Elements  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Parsing HTML with the bs4 Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating a BeautifulSoup Object from HTML .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Finding an Element with the select() Method  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting Data from an Element’s Attributes .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Opening All Search Results .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Get the Command Line Arguments and Request the Search Page  .
Step 2: Find All the Results  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Open Web Browsers for Each Result .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Downloading All XKCD Comics .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Design the Program .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Download the Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Step 3: Find and Download the Comic Image .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 4: Save the Image and Find the Previous Comic .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Controlling the Browser with the selenium Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Starting a selenium-Controlled Browser .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Finding Elements on the Page  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Clicking the Page .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Filling Out and Submitting Forms .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sending Special Keys .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Clicking Browser Buttons .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
More Information on Selenium .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

xvi   Contents in Detail

261
263
264
265
266
266

267
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

268
268
269
270
270
271
271
272
273
274
274
274
275
276
278
279
280
280
282
283
283
284
285
285
286
287
288
288
289
290
291
291
293
295
295
296
297
297

Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .
Command Line Emailer .  .
Image Site Downloader  .
2048 .  .  .  .  .  .  .  .  .  .  .  .  .  .
Link Verification .  .  .  .  .  .  .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .

Excel Documents .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Installing the openpyxl Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Reading Excel Documents  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Opening Excel Documents with OpenPyXL  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting Sheets from the Workbook .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting Cells from the Sheets .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Converting Between Column Letters and Numbers .  .  .  .  .  .  .  .
Getting Rows and Columns from the Sheets .  .  .  .  .  .  .  .  .  .  .  .  .
Workbooks, Sheets, Cells .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Reading Data from a Spreadsheet .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Read the Spreadsheet Data  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Populate the Data Structure  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Write the Results to a File .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Writing Excel Documents .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating and Saving Excel Documents .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating and Removing Sheets  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Writing Values to Cells .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Updating a Spreadsheet .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Set Up a Data Structure with the Update Information .
Step 2: Check All Rows and Update Incorrect Prices .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Setting the Font Style of Cells .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Font Objects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Formulas  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Adjusting Rows and Columns .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Setting Row Height and Column Width .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Merging and Unmerging Cells .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Freezing Panes  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Charts .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Multiplication Table Maker .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Blank Row Inserter .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Spreadsheet Cell Inverter  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Text Files to Spreadsheet .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Spreadsheet to Text Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

13
WORKING WITH EXCEL SPREADSHEETS

297
297
298
298
298
299
299

301
302
302
302
303
304
304
306
306
308
308
309
310
311
312
313
313
314
314
315
316
317
317
318
318
319
320
321
322
322
324
325
326
326
326
327
327
328
328

Contents in Detail   xvii

14
WORKING WITH GOOGLE SHEETS
Installing and Setting Up EZSheets . . . . . . . . . . . . . . . .
Obtaining Credentials and Token Files .  .  .  .  .  .  .
Revoking the Credentials File .  .  .  .  .  .  .  .  .  .  .  .  .  .
Spreadsheet Objects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating, Uploading, and Listing Spreadsheets .
Spreadsheet Attributes  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Downloading and Uploading Spreadsheets .  .  .  .
Deleting Spreadsheets  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sheet Objects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Reading and Writing Data  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating and Deleting Sheets  .  .  .  .  .  .  .  .  .  .  .  .  .
Copying Sheets .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Working with Google Sheets Quotas  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Downloading Google Forms Data  .  .  .  .  .  .  .  .  .  .
Converting Spreadsheets to Other Formats  .  .  .  .
Finding Mistakes in a Spreadsheet .  .  .  .  .  .  .  .  .  .

329
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

15
WORKING WITH PDF AND WORD DOCUMENTS
PDF Documents .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Extracting Text from PDFs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Decrypting PDFs .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating PDFs .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Combining Select Pages from Many PDFs .  .  .  .  .  .  .  .
Step 1: Find All PDF Files  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Open Each PDF  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Add Each Page  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 4: Save the Results  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Word Documents  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Reading Word Documents  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting the Full Text from a .docx File .  .  .  .  .  .  .  .  .  .
Styling Paragraph and Run Objects .  .  .  .  .  .  .  .  .  .  .
Creating Word Documents with Nondefault Styles .
Run Attributes  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Writing Word Documents .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Adding Headings .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Adding Line and Page Breaks .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Adding Pictures .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Creating PDFs from Word Documents .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

xviii   Contents in Detail

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

329
330
332
332
333
334
335
336
336
337
341
343
343
344
344
345
345
345
345

347
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

347
348
349
350
355
355
356
357
357
358
358
359
360
361
362
362
364
366
366
367
367
368
368

Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
PDF Paranoia  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Custom Invitations as Word Documents .
Brute-Force PDF Password Breaker .  .  .  .  .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

 .
 .
.
 .

16
WORKING WITH CSV FILES AND JSON DATA

371

The csv Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
reader Objects  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Reading Data from reader Objects in a for Loop .  .  .  .  .  .
writer Objects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The delimiter and lineterminator Keyword Arguments .  .  .
DictReader and DictWriter CSV Objects .  .  .  .  .  .  .  .  .  .  .  .
Project: Removing the Header from CSV Files .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Loop Through Each CSV File  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Read in the CSV File .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Write Out the CSV File Without the First Row .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
JSON and APIs .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The json Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Reading JSON with the loads() Function .  .  .  .  .  .  .  .  .  .  .  .
Writing JSON with the dumps() Function .  .  .  .  .  .  .  .  .  .  .  .
Project: Fetching Current Weather Data .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Get Location from the Command Line Argument .
Step 2: Download the JSON Data .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Load JSON Data and Print Weather .  .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Project .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Excel-to-CSV Converter .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

17
KEEPING TIME, SCHEDULING TASKS,
AND LAUNCHING PROGRAMS
The time Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The time.time() Function . . . . . . . . . . . . . .
The time.sleep() Function .  .  .  .  .  .  .  .  .  .  .  .  .  .
Rounding Numbers .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Super Stopwatch .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Set Up the Program to Track Times  .
Step 2: Track and Print Lap Times  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .
The datetime Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
The timedelta Data Type .  .  .  .  .  .  .  .  .  .  .  .  .  .
Pausing Until a Specific Date .  .  .  .  .  .  .  .  .  .  .
Converting datetime Objects into Strings .  .  .
Converting Strings into datetime Objects .  .  .

369
369
369
370

372
373
374
374
375
376
378
378
379
380
381
381
382
382
383
383
384
385
385
387
387
387
388
388

389
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

390
390
391
392
392
393
393
394
395
396
397
398
399

Contents in Detail   xix

Review of Python’s Time Functions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Multithreading  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Passing Arguments to the Thread’s Target Function .  .  .  .  .  .  .
Concurrency Issues .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Multithreaded XKCD Downloader  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Modify the Program to Use a Function .  .  .  .  .  .  .  .  .  .
Step 2: Create and Start Threads .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Wait for All Threads to End .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Launching Other Programs from Python .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Passing Command Line Arguments to the Popen() Function  .
Task Scheduler, launchd, and cron .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Opening Websites with Python  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Running Other Python Scripts .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Opening Files with Default Applications .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Simple Countdown Program .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Count Down .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Play the Sound File .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Prettified Stopwatch .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Scheduled Web Comic Downloader . . . . . . . . . . . . . . . .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
.

18
SENDING EMAIL AND TEXT MESSAGES
Sending and Receiving Email with the Gmail API  .  .  .  .  .  .  .
Enabling the Gmail API .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sending Mail from a Gmail Account . . . . . . . . .
Reading Mail from a Gmail Account  .  .  .  .  .  .  .  .  .
Searching Mail from a Gmail Account  .  .  .  .  .  .  .  .
Downloading Attachments from a Gmail Account
SMTP .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sending Email  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Connecting to an SMTP Server .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sending the SMTP “Hello” Message .  .  .  .  .  .  .  .  .  .
Starting TLS Encryption .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Logging In to the SMTP Server .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sending an Email .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Disconnecting from the SMTP Server .  .  .  .  .  .  .  .  .  .
IMAP .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Retrieving and Deleting Emails with IMAP  .  .  .  .  .  .  .  .  .  .  .  .
Connecting to an IMAP Server .  .  .  .  .  .  .  .  .  .  .  .  .  .
Logging In to the IMAP Server .  .  .  .  .  .  .  .  .  .  .  .  .  .
Searching for Email  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Fetching an Email and Marking It as Read  .  .  .  .  .
Getting Email Addresses from a Raw Message  .  .

xx   Contents in Detail

399
400
402
403
403
403
405
405
406
408
408
409
409
409
410
410
411
412
412
412
413
413
413

415
 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
.
 .
 .
.
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

416
416
417
418
419
419
420
420
421
422
422
423
423
424
424
424
425
426
426
430
431

Getting the Body from a Raw Message .  .  .  .
Deleting Emails  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Disconnecting from the IMAP Server .  .  .  .  .  .
Project: Sending Member Dues Reminder Emails .  .  .  .
Step 1: Open the Excel File .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Find All Unpaid Members  .  .  .  .  .  .  .
Step 3: Send Customized Email Reminders .
Sending Text Messages with SMS Email Gateways .  .
Sending Text Messages with Twilio .  .  .  .  .  .  .  .  .  .  .  .  .
Signing Up for a Twilio Account  .  .  .  .  .  .  .  .
Sending Text Messages  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: “Just Text Me” Module .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Random Chore Assignment Emailer  .  .  .  .  .  .
Umbrella Reminder .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Auto Unsubscriber .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Controlling Your Computer Through Email .  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

Computer Image Fundamentals .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Colors and RGBA Values  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Coordinates and Box Tuples  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Manipulating Images with Pillow .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Working with the Image Data Type  .  .  .  .  .  .  .  .  .  .  .  .
Cropping Images .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Copying and Pasting Images onto Other Images .  .  .
Resizing an Image .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Rotating and Flipping Images  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Changing Individual Pixels  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Adding a Logo  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Open the Logo Image .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Loop Over All Files and Open Images .  .  .  .  .
Step 3: Resize the Images .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 4: Add the Logo and Save the Changes  .  .  .  .  .
Ideas for Similar Programs  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Drawing on Images .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Drawing Shapes  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Drawing Text .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Extending and Fixing the Chapter Project Programs .
Identifying Photo Folders on the Hard Drive .  .  .  .  .  .  .
Custom Seating Cards  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

19
MANIPULATING IMAGES

431
432
433
433
434
435
436
437
438
439
439
441
442
443
443
443
444
444
444

447
448
448
449
450
451
453
454
456
457
459
460
461
462
463
463
465
465
466
468
469
470
470
470
471
472

Contents in Detail   xxi

20
CONTROLLING THE KEYBOARD AND MOUSE
WITH GUI AUTOMATION
Installing the pyautogui Module  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Setting Up Accessibility Apps on macOS .  .  .  .  .  .  .  .  .  .  .
Staying on Track .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Pauses and Fail-Safes .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Shutting Down Everything by Logging Out .  .  .  .
Controlling Mouse Movement .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Moving the Mouse .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting the Mouse Position  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Controlling Mouse Interaction .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Clicking the Mouse .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Dragging the Mouse .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Scrolling the Mouse .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Planning Your Mouse Movements .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Working with the Screen .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting a Screenshot  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Analyzing the Screenshot  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Image Recognition  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Getting Window Information  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Obtaining the Active Window .  .  .  .  .  .  .  .  .  .  .  .
Other Ways of Obtaining Windows .  .  .  .  .  .  .  .
Manipulating Windows  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Controlling the Keyboard .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Sending a String from the Keyboard .  .  .  .  .  .  .  .
Key Names .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Pressing and Releasing the Keyboard .  .  .  .  .  .  .
Hotkey Combinations .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Setting Up Your GUI Automation Scripts  .  .  .  .  .  .  .  .  .  .  .
Review of the PyAutoGUI Functions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Project: Automatic Form Filler .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 1: Figure Out the Steps .  .  .  .  .  .  .  .  .  .  .  .  .
Step 2: Set Up Coordinates .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 3: Start Typing Data  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Step 4: Handle Select Lists and Radio Buttons  .
Step 5: Submit the Form and Wait .  .  .  .  .  .  .  .  .
Displaying Message Boxes .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Summary .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Questions .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Practice Projects .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Looking Busy .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Using the Clipboard to Read a Text Field  .  .  .  .
Instant Messenger Bot .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Game-Playing Bot Tutorial .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

xxii   Contents in Detail

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

473
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

474
474
475
475
475
475
477
477
478
478
479
480
481
482
482
483
484
485
486
487
487
489
489
490
491
492
492
493
495
496
496
498
499
500
501
502
503
503
503
503
504
505

A
INSTALLING THIRD-PARTY MODULES

507

The pip Tool .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 507
Installing Third-Party Modules .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 508
Installing Modules for the Mu Editor  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 510

B
RUNNING PROGRAMS
Running
Running
Running
Running
Running

511

Programs from the Terminal Window  .  .  .  .
Python Programs on Windows .  .  .  .  .  .  .  .  .
Python Programs on macOS .  .  .  .  .  .  .  .  .  .  .
Python Programs on Ubuntu Linux .  .  .  .  .  .  .
Python Programs with Assertions Disabled .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

 .
 .
 .
 .
 .

C
ANSWERS TO THE PRACTICE QUESTIONS
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter

INDEX

1  .  .
2  .  .
3  .  .
4  .  .
5  .  .
6  .  .
7  .  .
8  .  .
9  .  .
10  .
11  .
12  .
13  .
14  .
15  .
16  .
17  .
18  .
19  .
20  .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

511
513
514
514
515

517
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .

518
518
520
520
521
521
522
523
523
524
524
525
526
527
527
528
528
529
529
529

531

Contents in Detail   xxiii

ACKNOWLEDGMENTS

It’s misleading to have just my name on the cover.
I couldn’t have written a book like this without the
help of a lot of people. I’d like to thank my publisher,
Bill Pollock; my editors, Laurel Chun, Leslie Shen,
Greg Poulos, Jennifer Griffith-Delgado, and Frances
Saux; and the rest of the staff at No Starch Press for
their invaluable help. Thanks to my tech reviewers,
Ari Lacenski and Philip James, for great suggestions,
edits, and support.
Many thanks to everyone at the Python Software Foundation for their
great work. The Python community is the best one I’ve found in the tech
industry.
Finally, I would like to thank my family, friends, and the gang at
Shotwell’s for not minding the busy life I’ve had while writing this book.
Cheers!

INTRODUCTION

“You’ve just done in two hours what it takes
the three of us two days to do.” My college
roommate was working at a retail electronics
store in the early 2000s. Occasionally, the store
would receive a spreadsheet of thousands of product
prices from other stores. A team of three employees
would print the spreadsheet onto a thick stack of paper and split it among
themselves. For each product price, they would look up their store’s price
and note all the products that their competitors sold for less. It usually took
a couple of days.
“You know, I could write a program to do that if you have the original
file for the printouts,” my roommate told them, when he saw them sitting
on the floor with papers scattered and stacked all around.
After a couple of hours, he had a short program that read a competitor’s price from a file, found the product in the store’s database, and noted
whether the competitor was cheaper. He was still new to programming, so
he spent most of his time looking up documentation in a programming

book. The actual program took only a few seconds to run. My roommate
and his co-workers took an extra-long lunch that day.
This is the power of computer programming. A computer is like a
Swiss Army knife that you can configure for countless tasks. Many people
spend hours clicking and typing to perform repetitive tasks, unaware that
the machine they’re using could do their job in seconds if they gave it the
right instructions.

Whom Is This Book For?
Software is at the core of so many of the tools we use today: nearly everyone
uses social networks to communicate, many people have internet-connected
computers in their phones, and most office jobs involve interacting with a
computer to get work done. As a result, the demand for people who can
code has skyrocketed. Countless books, interactive web tutorials, and developer boot camps promise to turn ambitious beginners into software engineers with six-figure salaries.
This book is not for those people. It’s for everyone else.
On its own, this book won’t turn you into a prof