This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
other:python:misc_by_jyp [2021/07/15 13:29] jypeter [Working with paths and filenames] Added shutil and and example |
other:python:misc_by_jyp [2021/08/27 11:56] jypeter Added file name generation section |
||
---|---|---|---|
Line 2: | Line 2: | ||
<WRAP center round tip 60%> | <WRAP center round tip 60%> | ||
- | You will find on this page some useful, but unsorted, python tips and tricks that can't fit in a section of the main [[other:python:jyp_steps|JYP's recommended steps for learning python]] page | + | You will find on this page some **useful, but unsorted, python tips and tricks** that can't fit in a section of the main [[other:python:jyp_steps|JYP's recommended steps for learning python]] page |
</WRAP> | </WRAP> | ||
Line 50: | Line 50: | ||
* [[https://docs.python.org/3/library/pathlib.html#correspondence-to-tools-in-the-os-module|Matching pathlib, and os or os.path functions]] | * [[https://docs.python.org/3/library/pathlib.html#correspondence-to-tools-in-the-os-module|Matching pathlib, and os or os.path functions]] | ||
* [[https://docs.python.org/3/library/shutil.html|High-level file operations]] | * [[https://docs.python.org/3/library/shutil.html|High-level file operations]] | ||
+ | |||
+ | |||
+ | === Example: getting the full path of the Python used === | ||
+ | |||
+ | Note: the actual python may be different from the default python! | ||
+ | |||
+ | <code>$ which python | ||
+ | /usr/bin/python | ||
+ | |||
+ | $ /modfs/modtools/miniconda3//envs/analyse_3.6_test/bin/python | ||
+ | >>> import sys, shutil | ||
+ | >>> shutil.which('python') | ||
+ | '/usr/bin/python' | ||
+ | >>> sys.executable | ||
+ | '/modfs/modtools/miniconda3//envs/analyse_3.6_test/bin/python'</code> | ||
+ | |||
+ | |||
+ | === Example: getting the full path of a script === | ||
+ | |||
+ | <code>>>> import os | ||
+ | >>> os.getcwd() | ||
+ | '/home/jypmce/PMIP4' | ||
+ | >>> os.path.exists('./argv_test.py') | ||
+ | True | ||
+ | >>> os.path.abspath('./argv_test.py') | ||
+ | '/home/jypmce/PMIP4/argv_test.py' | ||
+ | >>> os.path.exists('/home/jypmce/PMIP4/argv_test.py') | ||
+ | True | ||
+ | </code> | ||
+ | |||
=== Example: getting the size(s) of all the files in a directory === | === Example: getting the size(s) of all the files in a directory === | ||
Line 72: | Line 102: | ||
>>> sum(files_sizes) | >>> sum(files_sizes) | ||
64792</code> | 64792</code> | ||
+ | |||
+ | ==== Generating file names ==== | ||
+ | |||
+ | === Name depending on the current date/time === | ||
+ | |||
+ | <code>>>> import time | ||
+ | >>> plot_version = time.strftime('%Y%m%d_%H%M') | ||
+ | >>> f_name = 'test_%s.nc' % (plot_version,) | ||
+ | >>> f_name | ||
+ | 'test_20210827_1334.nc' | ||
+ | </code> | ||
+ | |||
+ | === Temporary file === | ||
+ | |||
+ | <code>>>> import tempfile, os | ||
+ | >>> f_tmp = tempfile.NamedTemporaryFile(mode='w', suffix='.nc', delete=False) | ||
+ | >>> f_tmp | ||
+ | <tempfile._TemporaryFileWrapper object at 0x2b5614743820> | ||
+ | >>> f_tmp.name | ||
+ | '/tmp/tmpi6uk9hre.nc' | ||
+ | >>> f_tmp.close() | ||
+ | >>> os.remove(f_tmp.name)</code> | ||
==== Using command-line arguments ==== | ==== Using command-line arguments ==== | ||
Line 107: | Line 159: | ||
[[https://docs.python.org/3/library/argparse.html|argparse]] (//parser for command-line options, arguments and sub-commands//) is available since Python version 3.2 | [[https://docs.python.org/3/library/argparse.html|argparse]] (//parser for command-line options, arguments and sub-commands//) is available since Python version 3.2 | ||
+ | |||
+ | ==== Using ordered dictionaries ==== | ||
+ | |||
+ | **Dictionary order is guaranteed to be insertion order**! Note that the [[https://docs.python.org/3/library/stdtypes.html#dict|usual Python dictionary]] also guarantees the order since version **3.6** | ||
+ | |||
+ | Check the [[https://docs.python.org/3/library/collections.html#collections.OrderedDict|OrderedDict class]] (''from collections import OrderedDict'') and the [[https://realpython.com/python-ordereddict/|OrderedDict vs dict in Python: The Right Tool for the Job]] tutorial | ||
+ | |||
+ | ==== Printing a readable version of long lists or dictionaries ==== | ||
+ | |||
+ | The [[https://docs.python.org/3/library/pprint.html|pprint]] module can be used for //pretty printing// objects (lists, dictionaries, ...). It will wrap long lines in a meaningful way | ||
+ | |||
+ | <code>>>> from collections import OrderedDict | ||
+ | |||
+ | >>> test_dic = OrderedDict([('AWI-ESM-1-1-LR_AWI', {'r1i1p1f1': {'grid': 'gn'}}), ('CESM2_NCAR', {'r1i1p1f1': {'grid': 'gn'}}), ('IPSL-CM6A-LR_IPSL', {'r1i1p1f1': {'grid': 'gr'}, 'r1i1p1f2': {'grid': 'gr'}, 'r1i1p1f3': {'grid': 'gr'}, 'r1i1p1f4': {'grid': 'gr'}})]) | ||
+ | |||
+ | >>> print(test_dic) | ||
+ | OrderedDict([('AWI-ESM-1-1-LR_AWI', {'r1i1p1f1': {'grid': 'gn'}}), ('CESM2_NCAR', {'r1i1p1f1': {'grid': 'gn'}}), ('IPSL-CM6A-LR_IPSL', {'r1i1p1f1': {'grid': 'gr'}, 'r1i1p1f2': {'grid': 'gr'}, 'r1i1p1f3': {'grid': 'gr'}, 'r1i1p1f4': {'grid': 'gr'}})]) | ||
+ | |||
+ | >>> pprint.pprint(test_dic) | ||
+ | OrderedDict([('AWI-ESM-1-1-LR_AWI', {'r1i1p1f1': {'grid': 'gn'}}), | ||
+ | ('CESM2_NCAR', {'r1i1p1f1': {'grid': 'gn'}}), | ||
+ | ('IPSL-CM6A-LR_IPSL', | ||
+ | {'r1i1p1f1': {'grid': 'gr'}, | ||
+ | 'r1i1p1f2': {'grid': 'gr'}, | ||
+ | 'r1i1p1f3': {'grid': 'gr'}, | ||
+ | 'r1i1p1f4': {'grid': 'gr'}})]) | ||
+ | </code> | ||
/* | /* |