blob: 82261a6513489a22a1082410f284006c7563c08c [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
Ned Deily5489bda2018-01-31 17:44:09 -050018 'C:\\Python38'
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
75The :mod:`getopt` module processes *sys.argv* using the conventions of the Unix
76:func:`getopt` function. More powerful and flexible command line processing is
Steven Bethard6d265692010-03-02 09:22:57 +000077provided by the :mod:`argparse` module.
Georg Brandl116aa622007-08-15 14:28:22 +000078
79
80.. _tut-stderr:
81
82Error Output Redirection and Program Termination
83================================================
84
85The :mod:`sys` module also has attributes for *stdin*, *stdout*, and *stderr*.
86The latter is useful for emitting warnings and error messages to make them
87visible even when *stdout* has been redirected::
88
89 >>> sys.stderr.write('Warning, log file not found starting a new one\n')
90 Warning, log file not found starting a new one
91
92The most direct way to terminate a script is to use ``sys.exit()``.
93
94
95.. _tut-string-pattern-matching:
96
97String Pattern Matching
98=======================
99
100The :mod:`re` module provides regular expression tools for advanced string
101processing. For complex matching and manipulation, regular expressions offer
102succinct, optimized solutions::
103
104 >>> import re
105 >>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
106 ['foot', 'fell', 'fastest']
107 >>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
108 'cat in the hat'
109
110When only simple capabilities are needed, string methods are preferred because
111they are easier to read and debug::
112
113 >>> 'tea for too'.replace('too', 'two')
114 'tea for two'
115
116
117.. _tut-mathematics:
118
119Mathematics
120===========
121
122The :mod:`math` module gives access to the underlying C library functions for
123floating point math::
124
125 >>> import math
Georg Brandlf6945182008-02-01 11:56:49 +0000126 >>> math.cos(math.pi / 4)
Georg Brandl116aa622007-08-15 14:28:22 +0000127 0.70710678118654757
128 >>> math.log(1024, 2)
129 10.0
130
131The :mod:`random` module provides tools for making random selections::
132
133 >>> import random
134 >>> random.choice(['apple', 'pear', 'banana'])
135 'apple'
136 >>> random.sample(range(100), 10) # sampling without replacement
137 [30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
138 >>> random.random() # random float
139 0.17970987693706186
140 >>> random.randrange(6) # random integer chosen from range(6)
Georg Brandl48310cd2009-01-03 21:18:54 +0000141 4
Georg Brandl116aa622007-08-15 14:28:22 +0000142
Andrew Kuchlingd71b1702015-04-09 22:20:01 -0400143The :mod:`statistics` module calculates basic statistical properties
144(the mean, median, variance, etc.) of numeric data::
145
146 >>> import statistics
147 >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
148 >>> statistics.mean(data)
149 1.6071428571428572
150 >>> statistics.median(data)
151 1.25
152 >>> statistics.variance(data)
153 1.3720238095238095
154
Serhiy Storchaka6dff0202016-05-07 10:49:07 +0300155The SciPy project <https://scipy.org> has many other modules for numerical
Guido van Rossum0616b792007-08-31 03:25:11 +0000156computations.
Georg Brandl116aa622007-08-15 14:28:22 +0000157
158.. _tut-internet-access:
159
160Internet Access
161===============
162
163There are a number of modules for accessing the internet and processing internet
Senthil Kumaranaca8fd72008-06-23 04:41:59 +0000164protocols. Two of the simplest are :mod:`urllib.request` for retrieving data
Ezio Melottic926c592012-09-24 17:07:39 +0300165from URLs and :mod:`smtplib` for sending mail::
Georg Brandl116aa622007-08-15 14:28:22 +0000166
Georg Brandl0f7ede42008-06-23 11:23:31 +0000167 >>> from urllib.request import urlopen
Berker Peksag9575e182015-04-12 13:52:49 +0300168 >>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response:
169 ... for line in response:
170 ... line = line.decode('utf-8') # Decoding the binary data to text.
171 ... if 'EST' in line or 'EDT' in line: # look for Eastern Time
172 ... print(line)
Georg Brandl116aa622007-08-15 14:28:22 +0000173
174 <BR>Nov. 25, 09:43:32 PM EST
175
176 >>> import smtplib
177 >>> server = smtplib.SMTP('localhost')
178 >>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
Guido van Rossumf10aa982007-08-17 18:30:38 +0000179 ... """To: jcaesar@example.org
180 ... From: soothsayer@example.org
181 ...
182 ... Beware the Ides of March.
183 ... """)
Georg Brandl116aa622007-08-15 14:28:22 +0000184 >>> server.quit()
185
Guido van Rossumf10aa982007-08-17 18:30:38 +0000186(Note that the second example needs a mailserver running on localhost.)
187
Georg Brandl116aa622007-08-15 14:28:22 +0000188
189.. _tut-dates-and-times:
190
191Dates and Times
192===============
193
194The :mod:`datetime` module supplies classes for manipulating dates and times in
195both simple and complex ways. While date and time arithmetic is supported, the
196focus of the implementation is on efficient member extraction for output
197formatting and manipulation. The module also supports objects that are timezone
198aware. ::
199
Ezio Melotti87e5d342009-11-12 10:38:55 +0000200 >>> # dates are easily constructed and formatted
Georg Brandl116aa622007-08-15 14:28:22 +0000201 >>> from datetime import date
202 >>> now = date.today()
203 >>> now
204 datetime.date(2003, 12, 2)
205 >>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
206 '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
207
Ezio Melotti87e5d342009-11-12 10:38:55 +0000208 >>> # dates support calendar arithmetic
Georg Brandl116aa622007-08-15 14:28:22 +0000209 >>> birthday = date(1964, 7, 31)
210 >>> age = now - birthday
211 >>> age.days
212 14368
213
214
215.. _tut-data-compression:
216
217Data Compression
218================
219
220Common data archiving and compression formats are directly supported by modules
Ezio Melotti0ada6f12012-10-26 19:33:07 +0300221including: :mod:`zlib`, :mod:`gzip`, :mod:`bz2`, :mod:`lzma`, :mod:`zipfile` and
Georg Brandl116aa622007-08-15 14:28:22 +0000222:mod:`tarfile`. ::
223
224 >>> import zlib
Georg Brandl53afa6d2010-11-30 08:20:16 +0000225 >>> s = b'witch which has which witches wrist watch'
Georg Brandl116aa622007-08-15 14:28:22 +0000226 >>> len(s)
227 41
228 >>> t = zlib.compress(s)
229 >>> len(t)
230 37
231 >>> zlib.decompress(t)
Georg Brandl53afa6d2010-11-30 08:20:16 +0000232 b'witch which has which witches wrist watch'
Georg Brandl116aa622007-08-15 14:28:22 +0000233 >>> zlib.crc32(s)
234 226805979
235
236
237.. _tut-performance-measurement:
238
239Performance Measurement
240=======================
241
242Some Python users develop a deep interest in knowing the relative performance of
243different approaches to the same problem. Python provides a measurement tool
244that answers those questions immediately.
245
246For example, it may be tempting to use the tuple packing and unpacking feature
247instead of the traditional approach to swapping arguments. The :mod:`timeit`
248module quickly demonstrates a modest performance advantage::
249
250 >>> from timeit import Timer
251 >>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
252 0.57535828626024577
253 >>> Timer('a,b = b,a', 'a=1; b=2').timeit()
254 0.54962537085770791
255
256In contrast to :mod:`timeit`'s fine level of granularity, the :mod:`profile` and
257:mod:`pstats` modules provide tools for identifying time critical sections in
258larger blocks of code.
259
260
261.. _tut-quality-control:
262
263Quality Control
264===============
265
266One approach for developing high quality software is to write tests for each
267function as it is developed and to run those tests frequently during the
268development process.
269
270The :mod:`doctest` module provides a tool for scanning a module and validating
271tests embedded in a program's docstrings. Test construction is as simple as
272cutting-and-pasting a typical call along with its results into the docstring.
273This improves the documentation by providing the user with an example and it
274allows the doctest module to make sure the code remains true to the
275documentation::
276
277 def average(values):
278 """Computes the arithmetic mean of a list of numbers.
279
Guido van Rossum0616b792007-08-31 03:25:11 +0000280 >>> print(average([20, 30, 70]))
Georg Brandl116aa622007-08-15 14:28:22 +0000281 40.0
282 """
Georg Brandlf6945182008-02-01 11:56:49 +0000283 return sum(values) / len(values)
Georg Brandl116aa622007-08-15 14:28:22 +0000284
285 import doctest
286 doctest.testmod() # automatically validate the embedded tests
287
288The :mod:`unittest` module is not as effortless as the :mod:`doctest` module,
289but it allows a more comprehensive set of tests to be maintained in a separate
290file::
291
292 import unittest
293
294 class TestStatisticalFunctions(unittest.TestCase):
295
296 def test_average(self):
297 self.assertEqual(average([20, 30, 70]), 40.0)
298 self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
Raymond Hettinger8f35c892013-03-22 07:26:18 -0700299 with self.assertRaises(ZeroDivisionError):
300 average([])
301 with self.assertRaises(TypeError):
302 average(20, 30, 70)
Georg Brandl116aa622007-08-15 14:28:22 +0000303
Serhiy Storchakadba90392016-05-10 12:01:23 +0300304 unittest.main() # Calling from the command line invokes all tests
Georg Brandl116aa622007-08-15 14:28:22 +0000305
306
307.. _tut-batteries-included:
308
309Batteries Included
310==================
311
312Python has a "batteries included" philosophy. This is best seen through the
313sophisticated and robust capabilities of its larger packages. For example:
314
Georg Brandl38eceaa2008-05-26 11:14:17 +0000315* The :mod:`xmlrpc.client` and :mod:`xmlrpc.server` modules make implementing
Georg Brandl116aa622007-08-15 14:28:22 +0000316 remote procedure calls into an almost trivial task. Despite the modules
317 names, no direct knowledge or handling of XML is needed.
318
319* The :mod:`email` package is a library for managing email messages, including
Serhiy Storchaka0a36ac12018-05-31 07:39:00 +0300320 MIME and other :rfc:`2822`-based message documents. Unlike :mod:`smtplib` and
Georg Brandl116aa622007-08-15 14:28:22 +0000321 :mod:`poplib` which actually send and receive messages, the email package has
322 a complete toolset for building or decoding complex message structures
323 (including attachments) and for implementing internet encoding and header
324 protocols.
325
Andrew Kuchlingd71b1702015-04-09 22:20:01 -0400326* The :mod:`json` package provides robust support for parsing this
327 popular data interchange format. The :mod:`csv` module supports
328 direct reading and writing of files in Comma-Separated Value format,
329 commonly supported by databases and spreadsheets. XML processing is
330 supported by the :mod:`xml.etree.ElementTree`, :mod:`xml.dom` and
331 :mod:`xml.sax` packages. Together, these modules and packages
332 greatly simplify data interchange between Python applications and
333 other tools.
334
335* The :mod:`sqlite3` module is a wrapper for the SQLite database
336 library, providing a persistent database that can be updated and
337 accessed using slightly nonstandard SQL syntax.
Georg Brandl116aa622007-08-15 14:28:22 +0000338
339* Internationalization is supported by a number of modules including
340 :mod:`gettext`, :mod:`locale`, and the :mod:`codecs` package.