blob: cd73bc25967b6b9cf2a9107d8aa45da9512b4407 [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
Georg Brandl08a90122012-09-29 09:34:13 +020018 'C:\\Python34'
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
Guido van Rossum0616b792007-08-31 03:25:11 +0000143The SciPy project <http://scipy.org> has many other modules for numerical
144computations.
Georg Brandl116aa622007-08-15 14:28:22 +0000145
146.. _tut-internet-access:
147
148Internet Access
149===============
150
151There are a number of modules for accessing the internet and processing internet
Senthil Kumaranaca8fd72008-06-23 04:41:59 +0000152protocols. Two of the simplest are :mod:`urllib.request` for retrieving data
Ezio Melottic926c592012-09-24 17:07:39 +0300153from URLs and :mod:`smtplib` for sending mail::
Georg Brandl116aa622007-08-15 14:28:22 +0000154
Georg Brandl0f7ede42008-06-23 11:23:31 +0000155 >>> from urllib.request import urlopen
156 >>> for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
Senthil Kumaranac0b8892010-02-22 17:17:22 +0000157 ... line = line.decode('utf-8') # Decoding the binary data to text.
Georg Brandl116aa622007-08-15 14:28:22 +0000158 ... if 'EST' in line or 'EDT' in line: # look for Eastern Time
Guido van Rossum0616b792007-08-31 03:25:11 +0000159 ... print(line)
Georg Brandl116aa622007-08-15 14:28:22 +0000160
161 <BR>Nov. 25, 09:43:32 PM EST
162
163 >>> import smtplib
164 >>> server = smtplib.SMTP('localhost')
165 >>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
Guido van Rossumf10aa982007-08-17 18:30:38 +0000166 ... """To: jcaesar@example.org
167 ... From: soothsayer@example.org
168 ...
169 ... Beware the Ides of March.
170 ... """)
Georg Brandl116aa622007-08-15 14:28:22 +0000171 >>> server.quit()
172
Guido van Rossumf10aa982007-08-17 18:30:38 +0000173(Note that the second example needs a mailserver running on localhost.)
174
Georg Brandl116aa622007-08-15 14:28:22 +0000175
176.. _tut-dates-and-times:
177
178Dates and Times
179===============
180
181The :mod:`datetime` module supplies classes for manipulating dates and times in
182both simple and complex ways. While date and time arithmetic is supported, the
183focus of the implementation is on efficient member extraction for output
184formatting and manipulation. The module also supports objects that are timezone
185aware. ::
186
Ezio Melotti87e5d342009-11-12 10:38:55 +0000187 >>> # dates are easily constructed and formatted
Georg Brandl116aa622007-08-15 14:28:22 +0000188 >>> from datetime import date
189 >>> now = date.today()
190 >>> now
191 datetime.date(2003, 12, 2)
192 >>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
193 '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
194
Ezio Melotti87e5d342009-11-12 10:38:55 +0000195 >>> # dates support calendar arithmetic
Georg Brandl116aa622007-08-15 14:28:22 +0000196 >>> birthday = date(1964, 7, 31)
197 >>> age = now - birthday
198 >>> age.days
199 14368
200
201
202.. _tut-data-compression:
203
204Data Compression
205================
206
207Common data archiving and compression formats are directly supported by modules
Ezio Melotti0ada6f12012-10-26 19:33:07 +0300208including: :mod:`zlib`, :mod:`gzip`, :mod:`bz2`, :mod:`lzma`, :mod:`zipfile` and
Georg Brandl116aa622007-08-15 14:28:22 +0000209:mod:`tarfile`. ::
210
211 >>> import zlib
Georg Brandl53afa6d2010-11-30 08:20:16 +0000212 >>> s = b'witch which has which witches wrist watch'
Georg Brandl116aa622007-08-15 14:28:22 +0000213 >>> len(s)
214 41
215 >>> t = zlib.compress(s)
216 >>> len(t)
217 37
218 >>> zlib.decompress(t)
Georg Brandl53afa6d2010-11-30 08:20:16 +0000219 b'witch which has which witches wrist watch'
Georg Brandl116aa622007-08-15 14:28:22 +0000220 >>> zlib.crc32(s)
221 226805979
222
223
224.. _tut-performance-measurement:
225
226Performance Measurement
227=======================
228
229Some Python users develop a deep interest in knowing the relative performance of
230different approaches to the same problem. Python provides a measurement tool
231that answers those questions immediately.
232
233For example, it may be tempting to use the tuple packing and unpacking feature
234instead of the traditional approach to swapping arguments. The :mod:`timeit`
235module quickly demonstrates a modest performance advantage::
236
237 >>> from timeit import Timer
238 >>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
239 0.57535828626024577
240 >>> Timer('a,b = b,a', 'a=1; b=2').timeit()
241 0.54962537085770791
242
243In contrast to :mod:`timeit`'s fine level of granularity, the :mod:`profile` and
244:mod:`pstats` modules provide tools for identifying time critical sections in
245larger blocks of code.
246
247
248.. _tut-quality-control:
249
250Quality Control
251===============
252
253One approach for developing high quality software is to write tests for each
254function as it is developed and to run those tests frequently during the
255development process.
256
257The :mod:`doctest` module provides a tool for scanning a module and validating
258tests embedded in a program's docstrings. Test construction is as simple as
259cutting-and-pasting a typical call along with its results into the docstring.
260This improves the documentation by providing the user with an example and it
261allows the doctest module to make sure the code remains true to the
262documentation::
263
264 def average(values):
265 """Computes the arithmetic mean of a list of numbers.
266
Guido van Rossum0616b792007-08-31 03:25:11 +0000267 >>> print(average([20, 30, 70]))
Georg Brandl116aa622007-08-15 14:28:22 +0000268 40.0
269 """
Georg Brandlf6945182008-02-01 11:56:49 +0000270 return sum(values) / len(values)
Georg Brandl116aa622007-08-15 14:28:22 +0000271
272 import doctest
273 doctest.testmod() # automatically validate the embedded tests
274
275The :mod:`unittest` module is not as effortless as the :mod:`doctest` module,
276but it allows a more comprehensive set of tests to be maintained in a separate
277file::
278
279 import unittest
280
281 class TestStatisticalFunctions(unittest.TestCase):
282
283 def test_average(self):
284 self.assertEqual(average([20, 30, 70]), 40.0)
285 self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
Raymond Hettinger8f35c892013-03-22 07:26:18 -0700286 with self.assertRaises(ZeroDivisionError):
287 average([])
288 with self.assertRaises(TypeError):
289 average(20, 30, 70)
Georg Brandl116aa622007-08-15 14:28:22 +0000290
291 unittest.main() # Calling from the command line invokes all tests
292
293
294.. _tut-batteries-included:
295
296Batteries Included
297==================
298
299Python has a "batteries included" philosophy. This is best seen through the
300sophisticated and robust capabilities of its larger packages. For example:
301
Georg Brandl38eceaa2008-05-26 11:14:17 +0000302* The :mod:`xmlrpc.client` and :mod:`xmlrpc.server` modules make implementing
Georg Brandl116aa622007-08-15 14:28:22 +0000303 remote procedure calls into an almost trivial task. Despite the modules
304 names, no direct knowledge or handling of XML is needed.
305
306* The :mod:`email` package is a library for managing email messages, including
307 MIME and other RFC 2822-based message documents. Unlike :mod:`smtplib` and
308 :mod:`poplib` which actually send and receive messages, the email package has
309 a complete toolset for building or decoding complex message structures
310 (including attachments) and for implementing internet encoding and header
311 protocols.
312
313* The :mod:`xml.dom` and :mod:`xml.sax` packages provide robust support for
314 parsing this popular data interchange format. Likewise, the :mod:`csv` module
315 supports direct reads and writes in a common database format. Together, these
Ezio Melotti0639d5a2009-12-19 23:26:38 +0000316 modules and packages greatly simplify data interchange between Python
Georg Brandl116aa622007-08-15 14:28:22 +0000317 applications and other tools.
318
319* Internationalization is supported by a number of modules including
320 :mod:`gettext`, :mod:`locale`, and the :mod:`codecs` package.
321
322