blob: f32063e7f0960a50027d1b6b7867cd7f7efc9e61 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001.. _tut-brieftour:
2
3**********************************
4Brief Tour of the Standard Library
5**********************************
6
7
8.. _tut-os-interface:
9
10Operating System Interface
11==========================
12
13The :mod:`os` module provides dozens of functions for interacting with the
14operating system::
15
16 >>> import os
Georg Brandl116aa622007-08-15 14:28:22 +000017 >>> os.getcwd() # Return the current working directory
Ɓukasz Langa9ab2fb12019-06-04 22:12:32 +020018 'C:\\Python39'
Georg Brandlfe123902010-11-26 12:12:14 +000019 >>> os.chdir('/server/accesslogs') # Change current working directory
20 >>> os.system('mkdir today') # Run the command mkdir in the system shell
21 0
Georg Brandl116aa622007-08-15 14:28:22 +000022
23Be sure to use the ``import os`` style instead of ``from os import *``. This
Mark Dickinson934896d2009-02-21 20:59:32 +000024will keep :func:`os.open` from shadowing the built-in :func:`open` function which
Georg Brandl116aa622007-08-15 14:28:22 +000025operates much differently.
26
27.. index:: builtin: help
28
Mark Dickinson934896d2009-02-21 20:59:32 +000029The built-in :func:`dir` and :func:`help` functions are useful as interactive
Georg Brandl116aa622007-08-15 14:28:22 +000030aids for working with large modules like :mod:`os`::
31
32 >>> import os
33 >>> dir(os)
34 <returns a list of all module functions>
35 >>> help(os)
36 <returns an extensive manual page created from the module's docstrings>
37
38For daily file and directory management tasks, the :mod:`shutil` module provides
39a higher level interface that is easier to use::
40
41 >>> import shutil
42 >>> shutil.copyfile('data.db', 'archive.db')
Raymond Hettingerbd46e482014-05-22 23:37:09 +010043 'archive.db'
Georg Brandl116aa622007-08-15 14:28:22 +000044 >>> shutil.move('/build/executables', 'installdir')
Raymond Hettingerbd46e482014-05-22 23:37:09 +010045 'installdir'
Georg Brandl116aa622007-08-15 14:28:22 +000046
47
48.. _tut-file-wildcards:
49
50File Wildcards
51==============
52
53The :mod:`glob` module provides a function for making file lists from directory
54wildcard searches::
55
56 >>> import glob
57 >>> glob.glob('*.py')
58 ['primes.py', 'random.py', 'quote.py']
59
60
61.. _tut-command-line-arguments:
62
63Command Line Arguments
64======================
65
66Common utility scripts often need to process command line arguments. These
67arguments are stored in the :mod:`sys` module's *argv* attribute as a list. For
68instance the following output results from running ``python demo.py one two
69three`` at the command line::
70
71 >>> import sys
Guido van Rossum0616b792007-08-31 03:25:11 +000072 >>> print(sys.argv)
Georg Brandl116aa622007-08-15 14:28:22 +000073 ['demo.py', 'one', 'two', 'three']
74
mental24911342019-08-01 15:17:30 +010075The :mod:`argparse` module provides a mechanism to process command line arguments.
76It should always be preferred over directly processing ``sys.argv`` manually.
Georg Brandl116aa622007-08-15 14:28:22 +000077
mental24911342019-08-01 15:17:30 +010078Take, for example, the below snippet of code::
79
80 >>> import argparse
81 >>> from getpass import getuser
82 >>> parser = argparse.ArgumentParser(description='An argparse example.')
83 >>> parser.add_argument('name', nargs='?', default=getuser(), help='The name of someone to greet.')
84 >>> parser.add_argument('--verbose', '-v', action='count')
85 >>> args = parser.parse_args()
86 >>> greeting = ["Hi", "Hello", "Greetings! its very nice to meet you"][args.verbose % 3]
87 >>> print(f'{greeting}, {args.name}')
88 >>> if not args.verbose:
89 >>> print('Try running this again with multiple "-v" flags!')
Georg Brandl116aa622007-08-15 14:28:22 +000090
91.. _tut-stderr:
92
93Error Output Redirection and Program Termination
94================================================
95
96The :mod:`sys` module also has attributes for *stdin*, *stdout*, and *stderr*.
97The latter is useful for emitting warnings and error messages to make them
98visible even when *stdout* has been redirected::
99
100 >>> sys.stderr.write('Warning, log file not found starting a new one\n')
101 Warning, log file not found starting a new one
102
103The most direct way to terminate a script is to use ``sys.exit()``.
104
105
106.. _tut-string-pattern-matching:
107
108String Pattern Matching
109=======================
110
111The :mod:`re` module provides regular expression tools for advanced string
112processing. For complex matching and manipulation, regular expressions offer
113succinct, optimized solutions::
114
115 >>> import re
116 >>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
117 ['foot', 'fell', 'fastest']
118 >>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
119 'cat in the hat'
120
121When only simple capabilities are needed, string methods are preferred because
122they are easier to read and debug::
123
124 >>> 'tea for too'.replace('too', 'two')
125 'tea for two'
126
127
128.. _tut-mathematics:
129
130Mathematics
131===========
132
133The :mod:`math` module gives access to the underlying C library functions for
134floating point math::
135
136 >>> import math
Georg Brandlf6945182008-02-01 11:56:49 +0000137 >>> math.cos(math.pi / 4)
Georg Brandl116aa622007-08-15 14:28:22 +0000138 0.70710678118654757
139 >>> math.log(1024, 2)
140 10.0
141
142The :mod:`random` module provides tools for making random selections::
143
144 >>> import random
145 >>> random.choice(['apple', 'pear', 'banana'])
146 'apple'
147 >>> random.sample(range(100), 10) # sampling without replacement
148 [30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
149 >>> random.random() # random float
150 0.17970987693706186
151 >>> random.randrange(6) # random integer chosen from range(6)
Georg Brandl48310cd2009-01-03 21:18:54 +0000152 4
Georg Brandl116aa622007-08-15 14:28:22 +0000153
Andrew Kuchlingd71b1702015-04-09 22:20:01 -0400154The :mod:`statistics` module calculates basic statistical properties
155(the mean, median, variance, etc.) of numeric data::
156
157 >>> import statistics
158 >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
159 >>> statistics.mean(data)
160 1.6071428571428572
161 >>> statistics.median(data)
162 1.25
163 >>> statistics.variance(data)
164 1.3720238095238095
165
Serhiy Storchaka6dff0202016-05-07 10:49:07 +0300166The SciPy project <https://scipy.org> has many other modules for numerical
Guido van Rossum0616b792007-08-31 03:25:11 +0000167computations.
Georg Brandl116aa622007-08-15 14:28:22 +0000168
169.. _tut-internet-access:
170
171Internet Access
172===============
173
174There are a number of modules for accessing the internet and processing internet
Senthil Kumaranaca8fd72008-06-23 04:41:59 +0000175protocols. Two of the simplest are :mod:`urllib.request` for retrieving data
Ezio Melottic926c592012-09-24 17:07:39 +0300176from URLs and :mod:`smtplib` for sending mail::
Georg Brandl116aa622007-08-15 14:28:22 +0000177
Georg Brandl0f7ede42008-06-23 11:23:31 +0000178 >>> from urllib.request import urlopen
Berker Peksag9575e182015-04-12 13:52:49 +0300179 >>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response:
180 ... for line in response:
181 ... line = line.decode('utf-8') # Decoding the binary data to text.
182 ... if 'EST' in line or 'EDT' in line: # look for Eastern Time
183 ... print(line)
Georg Brandl116aa622007-08-15 14:28:22 +0000184
185 <BR>Nov. 25, 09:43:32 PM EST
186
187 >>> import smtplib
188 >>> server = smtplib.SMTP('localhost')
189 >>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
Guido van Rossumf10aa982007-08-17 18:30:38 +0000190 ... """To: jcaesar@example.org
191 ... From: soothsayer@example.org
192 ...
193 ... Beware the Ides of March.
194 ... """)
Georg Brandl116aa622007-08-15 14:28:22 +0000195 >>> server.quit()
196
Guido van Rossumf10aa982007-08-17 18:30:38 +0000197(Note that the second example needs a mailserver running on localhost.)
198
Georg Brandl116aa622007-08-15 14:28:22 +0000199
200.. _tut-dates-and-times:
201
202Dates and Times
203===============
204
205The :mod:`datetime` module supplies classes for manipulating dates and times in
206both simple and complex ways. While date and time arithmetic is supported, the
207focus of the implementation is on efficient member extraction for output
208formatting and manipulation. The module also supports objects that are timezone
209aware. ::
210
Ezio Melotti87e5d342009-11-12 10:38:55 +0000211 >>> # dates are easily constructed and formatted
Georg Brandl116aa622007-08-15 14:28:22 +0000212 >>> from datetime import date
213 >>> now = date.today()
214 >>> now
215 datetime.date(2003, 12, 2)
216 >>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
217 '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
218
Ezio Melotti87e5d342009-11-12 10:38:55 +0000219 >>> # dates support calendar arithmetic
Georg Brandl116aa622007-08-15 14:28:22 +0000220 >>> birthday = date(1964, 7, 31)
221 >>> age = now - birthday
222 >>> age.days
223 14368
224
225
226.. _tut-data-compression:
227
228Data Compression
229================
230
231Common data archiving and compression formats are directly supported by modules
Ezio Melotti0ada6f12012-10-26 19:33:07 +0300232including: :mod:`zlib`, :mod:`gzip`, :mod:`bz2`, :mod:`lzma`, :mod:`zipfile` and
Georg Brandl116aa622007-08-15 14:28:22 +0000233:mod:`tarfile`. ::
234
235 >>> import zlib
Georg Brandl53afa6d2010-11-30 08:20:16 +0000236 >>> s = b'witch which has which witches wrist watch'
Georg Brandl116aa622007-08-15 14:28:22 +0000237 >>> len(s)
238 41
239 >>> t = zlib.compress(s)
240 >>> len(t)
241 37
242 >>> zlib.decompress(t)
Georg Brandl53afa6d2010-11-30 08:20:16 +0000243 b'witch which has which witches wrist watch'
Georg Brandl116aa622007-08-15 14:28:22 +0000244 >>> zlib.crc32(s)
245 226805979
246
247
248.. _tut-performance-measurement:
249
250Performance Measurement
251=======================
252
253Some Python users develop a deep interest in knowing the relative performance of
254different approaches to the same problem. Python provides a measurement tool
255that answers those questions immediately.
256
257For example, it may be tempting to use the tuple packing and unpacking feature
258instead of the traditional approach to swapping arguments. The :mod:`timeit`
259module quickly demonstrates a modest performance advantage::
260
261 >>> from timeit import Timer
262 >>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
263 0.57535828626024577
264 >>> Timer('a,b = b,a', 'a=1; b=2').timeit()
265 0.54962537085770791
266
267In contrast to :mod:`timeit`'s fine level of granularity, the :mod:`profile` and
268:mod:`pstats` modules provide tools for identifying time critical sections in
269larger blocks of code.
270
271
272.. _tut-quality-control:
273
274Quality Control
275===============
276
277One approach for developing high quality software is to write tests for each
278function as it is developed and to run those tests frequently during the
279development process.
280
281The :mod:`doctest` module provides a tool for scanning a module and validating
282tests embedded in a program's docstrings. Test construction is as simple as
283cutting-and-pasting a typical call along with its results into the docstring.
284This improves the documentation by providing the user with an example and it
285allows the doctest module to make sure the code remains true to the
286documentation::
287
288 def average(values):
289 """Computes the arithmetic mean of a list of numbers.
290
Guido van Rossum0616b792007-08-31 03:25:11 +0000291 >>> print(average([20, 30, 70]))
Georg Brandl116aa622007-08-15 14:28:22 +0000292 40.0
293 """
Georg Brandlf6945182008-02-01 11:56:49 +0000294 return sum(values) / len(values)
Georg Brandl116aa622007-08-15 14:28:22 +0000295
296 import doctest
297 doctest.testmod() # automatically validate the embedded tests
298
299The :mod:`unittest` module is not as effortless as the :mod:`doctest` module,
300but it allows a more comprehensive set of tests to be maintained in a separate
301file::
302
303 import unittest
304
305 class TestStatisticalFunctions(unittest.TestCase):
306
307 def test_average(self):
308 self.assertEqual(average([20, 30, 70]), 40.0)
309 self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
Raymond Hettinger8f35c892013-03-22 07:26:18 -0700310 with self.assertRaises(ZeroDivisionError):
311 average([])
312 with self.assertRaises(TypeError):
313 average(20, 30, 70)
Georg Brandl116aa622007-08-15 14:28:22 +0000314
Serhiy Storchakadba90392016-05-10 12:01:23 +0300315 unittest.main() # Calling from the command line invokes all tests
Georg Brandl116aa622007-08-15 14:28:22 +0000316
317
318.. _tut-batteries-included:
319
320Batteries Included
321==================
322
323Python has a "batteries included" philosophy. This is best seen through the
324sophisticated and robust capabilities of its larger packages. For example:
325
Georg Brandl38eceaa2008-05-26 11:14:17 +0000326* The :mod:`xmlrpc.client` and :mod:`xmlrpc.server` modules make implementing
Georg Brandl116aa622007-08-15 14:28:22 +0000327 remote procedure calls into an almost trivial task. Despite the modules
328 names, no direct knowledge or handling of XML is needed.
329
330* The :mod:`email` package is a library for managing email messages, including
Serhiy Storchaka0a36ac12018-05-31 07:39:00 +0300331 MIME and other :rfc:`2822`-based message documents. Unlike :mod:`smtplib` and
Georg Brandl116aa622007-08-15 14:28:22 +0000332 :mod:`poplib` which actually send and receive messages, the email package has
333 a complete toolset for building or decoding complex message structures
334 (including attachments) and for implementing internet encoding and header
335 protocols.
336
Andrew Kuchlingd71b1702015-04-09 22:20:01 -0400337* The :mod:`json` package provides robust support for parsing this
338 popular data interchange format. The :mod:`csv` module supports
339 direct reading and writing of files in Comma-Separated Value format,
340 commonly supported by databases and spreadsheets. XML processing is
341 supported by the :mod:`xml.etree.ElementTree`, :mod:`xml.dom` and
342 :mod:`xml.sax` packages. Together, these modules and packages
343 greatly simplify data interchange between Python applications and
344 other tools.
345
346* The :mod:`sqlite3` module is a wrapper for the SQLite database
347 library, providing a persistent database that can be updated and
348 accessed using slightly nonstandard SQL syntax.
Georg Brandl116aa622007-08-15 14:28:22 +0000349
350* Internationalization is supported by a number of modules including
351 :mod:`gettext`, :mod:`locale`, and the :mod:`codecs` package.