From 107caaa6ae6be37ab30d57f11a70b6079df76863 Mon Sep 17 00:00:00 2001 From: chapinb Date: Fri, 16 Oct 2020 12:44:47 +0000 Subject: [PATCH] deploy: bbd02562917dd1c4baf5652ae2acdd61d029136b --- .buildinfo | 2 +- .doctrees/ch01_essentials.doctree | Bin 0 -> 71774 bytes ...section2.doctree => ch02_registry.doctree} | Bin 36128 -> 36360 bytes ...ction3.doctree => ch03_event_logs.doctree} | Bin 38681 -> 38954 bytes .doctrees/ch06_databases.doctree | Bin 0 -> 16927 bytes .doctrees/environment.pickle | Bin 43839 -> 44967 bytes .doctrees/index.doctree | Bin 31526 -> 33923 bytes .doctrees/section1.doctree | Bin 59544 -> 0 bytes .doctrees/section6.doctree | Bin 10311 -> 0 bytes ...ction1.rst.txt => ch01_essentials.rst.txt} | 12 +- ...section2.rst.txt => ch02_registry.rst.txt} | 6 +- ...ction3.rst.txt => ch03_event_logs.rst.txt} | 4 +- ...ection6.rst.txt => ch06_databases.rst.txt} | 4 +- _sources/index.rst.txt | 14 +- _static/documentation_options.js | 2 +- section1.html => ch01_essentials.html | 305 ++++++++++++------ section2.html => ch02_registry.html | 116 +++---- section3.html => ch03_event_logs.html | 70 ++-- section6.html => ch06_databases.html | 92 ++++-- genindex.html | 109 ++++--- index.html | 83 +++-- objects.inv | Bin 682 -> 748 bytes py-modindex.html | 30 +- search.html | 12 +- searchindex.js | 2 +- 25 files changed, 528 insertions(+), 335 deletions(-) create mode 100644 .doctrees/ch01_essentials.doctree rename .doctrees/{section2.doctree => ch02_registry.doctree} (52%) rename .doctrees/{section3.doctree => ch03_event_logs.doctree} (80%) create mode 100644 .doctrees/ch06_databases.doctree delete mode 100644 .doctrees/section1.doctree delete mode 100644 .doctrees/section6.doctree rename _sources/{section1.rst.txt => ch01_essentials.rst.txt} (62%) rename _sources/{section2.rst.txt => ch02_registry.rst.txt} (71%) rename _sources/{section3.rst.txt => ch03_event_logs.rst.txt} (73%) rename _sources/{section6.rst.txt => ch06_databases.rst.txt} (72%) rename section1.html => ch01_essentials.html (59%) rename section2.html => ch02_registry.html (73%) rename section3.html => ch03_event_logs.html (85%) rename section6.html => ch06_databases.html (65%) diff --git a/.buildinfo b/.buildinfo index 587c6f0..84638ee 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 68742d456087727ed42422957f408af7 +config: bba2bba94c5da3a0f35a41a0438a5a1d tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/ch01_essentials.doctree b/.doctrees/ch01_essentials.doctree new file mode 100644 index 0000000000000000000000000000000000000000..94c4d9ec2f0051755039513aeb7fdfd6b81251df GIT binary patch literal 71774 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 H=Lqwkz}wmG delta 2831 zcmds3T})eL80PDbEl_F(7C1%58C1Uhtsk_(38jEbEMVsxqBBpL}S&@ zccM%28|t^lSUMSH-XIgxL6!?qaoW$a5l8-suiNFArnrR9Pw`ATWyyi}mcv3swFfQ0 zosPF_HVxdeS_*a|srD*lFkfm@y5?ndRaGEL@jQ8&84vRUH+@)&!EAwE<8}DtP>bj> zXq6@$WygI9N(f;)nOQpvH?G_UT6bSlVa|_5MC?QVl3_c7$8E2ph(!8eVY)22hR^}9 zw!hN7Ny#RsmUODC9Gl|Rb^@VKccc@(HycH-$*3UO%bJ<(T&=*&RbqcR3lOoq1|M~t zD#)u?R0+@qXRTk$gC5#ucZk$)H>n2fl~rV1Nb(GqPTAyY@=13m`fv-0;B(pvvJn@Y z14=m%Je}JuF79V)b@=4q*)zvZJC3>sG1R)##RvD?K@{6k25_R^Ev_E+Ak+xYj;s(7 zW}0`9$61bKs6dEhgQO5*NIvO@Z;#%9{$r0(b49o%(Dy7VY8CKBuK^zPFbKnyVFR4( zYihzZb2x`(H&4qNR z@!bC|Lrp$IxaU1kQZ3?%{$Hw_mXuXh83k!3NG2$bXM6&eAK{>aOb=Yb-@qkXVjQx0~iK|+EthqFuXZx)8H5t;8>|X zMlJAYsO7(P{}O!W)x+ATwS=2&C%x~Z5qcGVA8T`M9jdvpAdOX9*=e@!H^4dSCv;b4 zD6IQ`MTDuG8Sw$V3(47lb$=tw1p5w|atg-SWL!wF;kdxN%ofs|8zf|m5kf321^rez zZ<3(~xH+X!XDxtzd=I+6bNCxC>I!|PAwgkdOMZTp#soL4jkvz_Jl}_@!YfFH#wraW zANJkw_40&*=VEIEQ5u@~?nQ%waLX|R`iWiebM!CtRb{+L_F`lHZ7$cd^0oUBw%9Xv~RH53b&^W>gvHRt8Y9&k*6vUajNXCxMsq!vv)BR_GAAcD7!F>$h?q?>q3esX+qQL=t= zhJkT>YFTPtNqkOzdhz6oj0pn#Xo8!qnBFj|ndj!Gl;)&bD-=|wPFStS45C(-pwh{GEMk+d)C8hiIr(CyA%+;x=*hmU|4C9`F_mvKGrJ5o zLO&RDxfGBMK>>zbmzk( z9j_6=BBxIM6sx;Zb`3jV|nb$^_9aDHRPi;UuB3IWISom(hLli7Hj1d}fK?XCJHOz|psxXy1LTe#}UU sYURznwcd;be75;x-6cNuWJo18`Bbk4jJ^41?=?13s({TEQx`G<00A~{LI3~& delta 1454 zcmZ3rfobMCCe{YlseIEXvUaiurzV$V=I2d3BR_GAAcD7!F=}!(qaQ~xMA~@r4aNjc zIB&BD(;G%Jqul(I(wtOlg@Veo{GyD+yp*K;{A@j_mUshWz0%^$y!7~j%94!yy!h0z zl8PxkhLiJIM7a=ZCQoM3WL!QupDh4c@En^VGMA5Cd~z}CZ$j!e^Re4%KtihAED@x*vQj_zGQsVPUbCXhwKzjUA zE2K*lAi@ezVNJNJV<%UN7LJC2Xx8K=Nejl}$-5;(kW$iSIjI;vOwoH9xh#@exRUYa zOx;*MHg&(m+*I|+XRNP4nVXl{=(1x9PX-E4e&B*>_vCvTE}IXy7Bez>Pd0JaLvq#R zLU&O~TU^#pUgB=gxQjpzS>mp~d6kDGBT)*wyp-^H_mrQfB%||Wkqk9-H=5#fV@-xR z<0b-btjUm{T$Fi}7C+}N0suYV;f(+Q diff --git a/.doctrees/ch06_databases.doctree b/.doctrees/ch06_databases.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2ab852e53e364ec74436ee2a6f225dde1f5c0ee6 GIT binary patch literal 16927 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 literal 31526 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 z znsBp__Z}2SII4k=ceE?Z`X?6N#o72JaCmXT)-U4nz`E>0$@7{x2nt z0Jl`K+{G^3_BAZY74%hi-3YB+QEdd3lVx|Q;x)<$Pk=9pIKs2>Mz?vY3n4AuCOCmh z^l>q5383q!EF?*W_!4vks))c4fg417h21mYRf(q@>_m^z+JgSEg{Z&A#kbN!@psAJ zfc5GB02`qHAu-2Fa{k)w%zDFPbfR9eRogj`@TENzs zu7G)#;hkkzXBo~}hH=(k#E1kmvkb{BLov$`%yRFu-198=I?FxIa&NPpx=;n(S}m*}H`QK|UD z6hgQ_A)I{ZJmLh=Ig7M44vmsjMTrrghAxppYr%h#J}x3kf06$B1buvxK6o8mOE2!G zk3oo{0)-Iu?(>K!efu7KrbWrd)KTc60Za7o^8YN2{r@7TrT;zp>q`1-4}CC8prdC# zohuuN9x6}>J?}k_=&=$u6~~WNNg+s`wnKad^TIFD=$RMNeO&(Ah*Q$>KA#fw`jo`i zr#vM-kzkvPGzXM$P$cFIex{r{M z$Xf!!pF_yZ)Nu*h+3s)!0TfGR`Pk@DYFpD5hWN+s@3a~ouCjI=57MEBF*sr~RFB7^i7r`mBy;#qm#>>=R_=?2h zH*>I~u=tlb<(OIZV$uI|)H67wGsOyr_gXkK_d4if$FNz%mulTg(I&5z9r`hg#v?US M_oQYd_M55y2TEuBVE_OC diff --git a/.doctrees/section6.doctree b/.doctrees/section6.doctree deleted file mode 100644 index 9ce00991397703e71fa3c95103f42b124fbcdbb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10311 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 diff --git a/_sources/section1.rst.txt b/_sources/ch01_essentials.rst.txt similarity index 62% rename from _sources/section1.rst.txt rename to _sources/ch01_essentials.rst.txt index 93a1adb..8dad7d9 100644 --- a/_sources/section1.rst.txt +++ b/_sources/ch01_essentials.rst.txt @@ -1,4 +1,4 @@ -Section 1 - Essential Scripts +Chapter 1 - Essential Scripts ============================== .. toctree:: :maxdepth: 2 @@ -6,27 +6,27 @@ Section 1 - Essential Scripts Section 1.1 - Argparse Example -------------------------------- -.. automodule:: pyforhandbook.section_01.argparse_example +.. automodule:: pyforhandbook.ch01_essentials.argparse_example :members: Section 1.2 - Logging Example -------------------------------- -.. automodule:: pyforhandbook.section_01.logging_example +.. automodule:: pyforhandbook.ch01_essentials.logging_example :members: Section 1.3 - Open Files ------------------------ -.. automodule:: pyforhandbook.section_01.open_files +.. automodule:: pyforhandbook.ch01_essentials.open_files :members: Section 1.4 - CSV Example -------------------------------- -.. automodule:: pyforhandbook.section_01.csv_example +.. automodule:: pyforhandbook.ch01_essentials.csv_example :members: Section 1.5 - Directory Recursion --------------------------------- -.. automodule:: pyforhandbook.section_01.recursion_example +.. automodule:: pyforhandbook.ch01_essentials.recursion_example :members: Indices and tables diff --git a/_sources/section2.rst.txt b/_sources/ch02_registry.rst.txt similarity index 71% rename from _sources/section2.rst.txt rename to _sources/ch02_registry.rst.txt index 44b55f1..164c4fe 100644 --- a/_sources/section2.rst.txt +++ b/_sources/ch02_registry.rst.txt @@ -1,4 +1,4 @@ -Section 2 - Registry Parsing +Chapter 2 - Registry Parsing ============================== .. toctree:: :maxdepth: 2 @@ -6,12 +6,12 @@ Section 2 - Registry Parsing Section 2.1 - Opening a Hive -------------------------------- -.. automodule:: pyforhandbook.section_02.yarp_base +.. automodule:: pyforhandbook.ch02_registry.yarp_base :members: Section 2.2 - Parsing Hive Values ---------------------------------- -.. automodule:: pyforhandbook.section_02.yarp_ntuser +.. automodule:: pyforhandbook.ch02_registry.yarp_ntuser :members: Indices and tables diff --git a/_sources/section3.rst.txt b/_sources/ch03_event_logs.rst.txt similarity index 73% rename from _sources/section3.rst.txt rename to _sources/ch03_event_logs.rst.txt index 5e2ff50..1a8edfc 100644 --- a/_sources/section3.rst.txt +++ b/_sources/ch03_event_logs.rst.txt @@ -1,4 +1,4 @@ -Section 3 - Windows Event Log Parsing +Chapter 3 - Windows Event Log Parsing ===================================== .. toctree:: :maxdepth: 2 @@ -6,7 +6,7 @@ Section 3 - Windows Event Log Parsing Section 3.1 - Using python-evtx ---------------------------------- -.. automodule:: pyforhandbook.section_03.using_python_evtx +.. automodule:: pyforhandbook.ch03_event_logs.using_python_evtx :members: Indices and tables diff --git a/_sources/section6.rst.txt b/_sources/ch06_databases.rst.txt similarity index 72% rename from _sources/section6.rst.txt rename to _sources/ch06_databases.rst.txt index 24ee294..894a4e9 100644 --- a/_sources/section6.rst.txt +++ b/_sources/ch06_databases.rst.txt @@ -1,4 +1,4 @@ -Section 6 - Sqlite & MacOS/Mobile/Browsers +Chapter 6 - Sqlite & MacOS/Mobile/Browsers ========================================== .. toctree:: :maxdepth: 2 @@ -6,7 +6,7 @@ Section 6 - Sqlite & MacOS/Mobile/Browsers Section 6.1 - Opening Sqlite -------------------------------- -.. automodule:: pyforhandbook.section_06.opening_sqlite +.. automodule:: pyforhandbook.ch06_databases.opening_sqlite :members: Indices and tables diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt index b64b138..246e5c1 100644 --- a/_sources/index.rst.txt +++ b/_sources/index.rst.txt @@ -5,18 +5,18 @@ The Python Forensics Handbook ============================= ---------------------------------------------- -A guide for developing Python scripts in DFIR ---------------------------------------------- +-------------------------------------------------------- +A reference guide for developing Python scripts in DFIR +-------------------------------------------------------- .. toctree:: :maxdepth: 1 :caption: Table of Contents: - section1 - section2 - section3 - section6 + ch01_essentials + ch02_registry + ch03_event_logs + ch06_databases Handbook Sections ============================== diff --git a/_static/documentation_options.js b/_static/documentation_options.js index 87d8188..1f7b0d1 100644 --- a/_static/documentation_options.js +++ b/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '0.1.0', + VERSION: '0.1.1', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/section1.html b/ch01_essentials.html similarity index 59% rename from section1.html rename to ch01_essentials.html index b636aca..d91f011 100644 --- a/section1.html +++ b/ch01_essentials.html @@ -7,7 +7,7 @@ - Section 1 - Essential Scripts — Python Forensics Handbook 0.1.0 documentation + Chapter 1 - Essential Scripts — Python Forensics Handbook 0.1.1 documentation @@ -36,7 +36,7 @@ - + @@ -72,7 +72,7 @@
- 0.1.0 + 0.1.1
@@ -99,28 +99,28 @@

Table of Contents:

    -
  • Section 1 - Essential Scripts
      -
    • Section 1.1 - Argparse Example
        +
      • Chapter 1 - Essential Scripts
          +
        • Section 1.1 - Argparse Example
        • -
        • Section 1.2 - Logging Example
            +
          • Section 1.2 - Logging Example
          • -
          • Section 1.3 - Open Files
              +
            • Section 1.3 - Open Files
            • -
            • Section 1.4 - CSV Example @@ -177,13 +177,13 @@
            • »
            • -
            • Section 1 - Essential Scripts
            • +
            • Chapter 1 - Essential Scripts
            • - View page source + View page source
            • @@ -196,12 +196,12 @@
              -
              -

              Section 1 - Essential Scripts

              +
              +

              Chapter 1 - Essential Scripts

              -
              -

              Section 1.1 - Argparse Example

              +
              +

              Section 1.1 - Argparse Example

              Example for setting up arguments for your command line utility.

              Example Usage:

              @@ -225,29 +225,35 @@ module has many more features documented at # description and epilog. The `formatter_class` instructs # argparse to show default values set for parameters. parser = argparse.ArgumentParser( - description='Sample Argparse', + description="Sample Argparse", formatter_class=argparse.ArgumentDefaultsHelpFormatter, - epilog=f"Built by {__author__}, v.{__date__}" + epilog=f"Built by {__author__}, v.{__date__}", ) # The simplest form of adding an argument, the name of the # parameter and a description of its form. - parser.add_argument('INPUT_FILE', help="Input file to parse") - parser.add_argument('OUTPUT_FOLDER', - help="Folder to store output") + parser.add_argument("INPUT_FILE", help="Input file to parse") + parser.add_argument("OUTPUT_FOLDER", help="Folder to store output") # An optional argument with multiple methods of specifying # the parameter. Includes a default value - parser.add_argument('-l', '--log', help="Path to log file", - default=os.path.abspath(os.path.join( - PurePath(__file__).parent, - PurePath(__file__).name.rsplit('.', 1)[0] + '.log')) + parser.add_argument( + "-l", + "--log", + help="Path to log file", + default=os.path.abspath( + os.path.join( + PurePath(__file__).parent, + PurePath(__file__).name.rsplit(".", 1)[0] + ".log", + ) + ), ) # An optional argument which does not accept a value, instead # just modifies functionality. - parser.add_argument('-v', '--verbose', action='store_true', - help='Include debug log messages') + parser.add_argument( + "-v", "--verbose", action="store_true", help="Include debug log messages" + ) # Once we've specified our arguments we can parse them for # reference @@ -259,8 +265,8 @@ module has many more features documented at
              -
              -

              Section 1.2 - Logging Example

              +
              +

              Section 1.2 - Logging Example

              Example for writing logging information to the console and a log file.

              Example Usage:

              @@ -280,64 +286,82 @@ to write content to STDOUT uninterrupted. Additionally, you can set different logging levels for the two handlers - generally you keep debugging information in the log file while writing more critical messages to the console in STDERR.

              -
              def setup_logging():
              -    """Function to setup logging configuration and test it."""
              -    # Allow us to modify the `logger` variable within a function
              -    global logger
              +
              def setup_logging(logging_obj, verbose=False):
              +    """Function to setup logging configuration and test it.
               
              -    # Set logger object, uses module's name
              -    logger = logging.getLogger(name=__name__)
              +    Args:
              +        logging_obj: A logging instance, returned from logging.getLogger().
              +        verbose: Whether or not to enable the debug level in STDERR output.
               
              -    # Set default logger level to DEBUG. You can change this later
              -    logger.setLevel(logging.DEBUG)
              +    Examples:
              +        >>> sample_logger = logging.getLogger(name=__name__)
              +        >>> sample_logger = setup_logging(sample_logger)
              +        >>> sample_logger.debug("This is a debug message")
              +        >>> sample_logger.info("This is an info message")
              +        >>> sample_logger.warning("This is a warning message")
              +        >>> sample_logger.error("This is a error message")
              +        >>> sample_logger.critical("This is a critical message")
              +    """
              +    logging_obj.setLevel(logging.DEBUG)
               
              -    # Logging formatter. Best to keep consistent for most usecases
              +    # Logging formatter. Best to keep consistent for most use cases
                   log_format = logging.Formatter(
              -        '%(asctime)s %(filename)s %(levelname)s %(module)s '
              -        '%(funcName)s %(lineno)d %(message)s')
              +        "%(asctime)s %(filename)s %(levelname)s %(module)s "
              +        "%(funcName)s %(lineno)d %(message)s"
              +    )
               
                   # Setup STDERR logging, allowing you uninterrupted
                   # STDOUT redirection
                   stderr_handle = logging.StreamHandler(stream=sys.stderr)
              -    stderr_handle.setLevel(logging.INFO)
              +    if verbose:
              +        stderr_handle.setLevel(logging.DEBUG)
              +    else:
              +        stderr_handle.setLevel(logging.INFO)
                   stderr_handle.setFormatter(log_format)
               
                   # Setup file logging
              -    file_handle = logging.FileHandler('sample.log', 'a')
              +    file_handle = logging.FileHandler("sample.log", "a")
                   file_handle.setLevel(logging.DEBUG)
                   file_handle.setFormatter(log_format)
               
                   # Add handles
              -    logger.addHandler(stderr_handle)
              -    logger.addHandler(file_handle)
              +    logging_obj.addHandler(stderr_handle)
              +    logging_obj.addHandler(file_handle)
               
              -    # Sample log messages
              -    logger.debug("This is a debug message")
              -    logger.info("This is an info message")
              -    logger.warning("This is a warning message")
              -    logger.error("This is a error message")
              -    logger.critical("This is a critical message")
              -
              -    def sample_function():
              -        """Sample function to demonstrate logging formatting."""
              -        logger.info("Called from a function")
              -
              -    sample_function()
              +    return logging_obj
               

              Docstring References

              -
              -setup_logging()
              +
              +setup_logging(logging_obj, verbose=False)

              Function to setup logging configuration and test it.

              +
              +
              Parameters
              +
                +
              • logging_obj – A logging instance, returned from logging.getLogger().

              • +
              • verbose – Whether or not to enable the debug level in STDERR output.

              • +
              +
              +
              +

              Examples

              +
              >>> sample_logger = logging.getLogger(name=__name__)
              +>>> sample_logger = setup_logging(sample_logger)
              +>>> sample_logger.debug("This is a debug message")
              +>>> sample_logger.info("This is an info message")
              +>>> sample_logger.warning("This is a warning message")
              +>>> sample_logger.error("This is a error message")
              +>>> sample_logger.critical("This is a critical message")
              +
              +
              -
              -

              Section 1.3 - Open Files

              +
              +

              Section 1.3 - Open Files

              Example for reading data from encoded text files.

              Demonstrates how to handle setting the proper encoding for UTF-8, UTF-16-LE, and UTF-16-BE with the ability to easily @@ -364,18 +388,17 @@ common text file encodings. Feel free to build and share on this.

              input_file (str): Path to file to open """ - test_encoding = open(input_file, 'rb') + test_encoding = open(input_file, "rb") bom = test_encoding.read(2) - file_encoding = 'utf-8' - if bom == b'FEFF': - file_encoding = 'utf-16-le' - elif bom == b'FFFE': - file_encoding = 'utf-16-be' + file_encoding = "utf-8" + if bom == b"FEFF": + file_encoding = "utf-16-le" + elif bom == b"FFFE": + file_encoding = "utf-16-be" - with open(input_file, 'r', encoding=file_encoding) as fopen: - for raw_line in fopen: + with open(input_file, "r", encoding=file_encoding) as open_input_file: + for raw_line in open_input_file: line = raw_line.strip() - print(line)
              @@ -383,8 +406,8 @@ common text file encodings. Feel free to build and share on this.

              Docstring References

              -
              -open_file(input_file)
              +
              +open_file(input_file)

              Opens an encoded text file and prints the contents

              Parameters
              @@ -395,8 +418,8 @@ common text file encodings. Feel free to build and share on this.

              -
              -

              Section 1.4 - CSV Example

              +
              +

              Section 1.4 - CSV Example

              Example for writing datasets into CSV files.

              Demonstrates source datasets comprised of lists of dictionaries and lists of lists as separate functions. Example data is @@ -424,7 +447,7 @@ multiple dictionaries to a CSV file. You can optionally provide an ordered list of headers to filter what rows to show, or let the function use the keys of the first dictionary in the list to generate the header information. The latter option may produce -a new order each iteration and is not prefered if you can +a new order each iteration and is not preferred if you can determine the headers in advance.

              def write_csv_dicts(outfile, data, headers=None):
                   """Writes a list of dictionaries to a CSV file.
              @@ -434,18 +457,24 @@ determine the headers in advance.

              data (list): List of dictionaries to write to file headers (list): Header row to use. If empty, will use the first dictionary in the `data` list. + + Example: + >>> list_of_dicts = [ + >>> {'name': 'apple', 'quantity': 10, 'location': 'VT'}, + >>> {'name': 'orange', 'quantity': 5, 'location': 'FL'} + >>> ] + >>> write_csv_dicts('dict_test.csv', list_of_dicts) """ if not headers: # Use the first line of data headers = [str(x) for x in data[0].keys()] - with open(outfile, 'w', newline="") as open_file: + with open(outfile, "w", newline="") as open_file: # Write only provided headers, ignore others - csvfile = csv.DictWriter(open_file, headers, - extrasaction='ignore') - csvfile.writeheader() - csvfile.writerows(data) + csv_file = csv.DictWriter(open_file, headers, extrasaction="ignore") + csv_file.writeheader() + csv_file.writerows(data)
              @@ -474,25 +503,33 @@ columns to the CSV.

              data (list): List of lists to write to file headers (list): Header row to use. If empty, will use the first list in the `data` list. + + Examples: + >>> fields = ['name', 'quantity', 'location'] + >>> list_of_lists = [ + >>> ['apple', 10, 'VT'], + >>> ['orange', 5, 'FL'] + >>> ] + >>> write_csv_lists('list_test.csv', list_of_lists, headers=fields) """ - with open(outfile, 'w', newline="") as open_file: + with open(outfile, "w", newline="") as open_file: # Write only provided headers, ignore others - csvfile = csv.writer(open_file) + csv_file = csv.writer(open_file) for count, entry in enumerate(data): if count == 0 and headers: # If headers are defined, write them, otherwise # continue as they will be written anyways - csvfile.writerow(headers) - csvfile.writerow(entry) + csv_file.writerow(headers) + csv_file.writerow(entry)

              Docstring References

              -
              -write_csv_dicts(outfile, data, headers=None)
              +
              +write_csv_dicts(outfile, data, headers=None)

              Writes a list of dictionaries to a CSV file.

              Parameters
              @@ -504,11 +541,19 @@ first dictionary in the data list.

            +

            Example

            +
            >>> list_of_dicts = [
            +>>>     {'name': 'apple', 'quantity': 10, 'location': 'VT'},
            +>>>     {'name': 'orange', 'quantity': 5, 'location': 'FL'}
            +>>> ]
            +>>> write_csv_dicts('dict_test.csv', list_of_dicts)
            +
            +
            -
            -write_csv_lists(outfile, data, headers=None)
            +
            +write_csv_lists(outfile, data, headers=None)

            Writes a list of lists to a CSV file.

            Parameters
            @@ -520,12 +565,21 @@ first list in the data list.

          +

          Examples

          +
          >>> fields = ['name', 'quantity', 'location']
          +>>> list_of_lists = [
          +>>>     ['apple', 10, 'VT'],
          +>>>     ['orange', 5, 'FL']
          +>>> ]
          +>>> write_csv_lists('list_test.csv', list_of_lists, headers=fields)
          +
          +
          -
          -

          Section 1.5 - Directory Recursion

          +
          +

          Section 1.5 - Directory Recursion

          File recursion example.

          Demonstration of iterating through a directory to interact with files.

          @@ -544,7 +598,16 @@ folders within a single directory. From here you can further interact with individual files and folders or iterate recursively by calling the function on identified subdirectories.

          def list_directory(path):
          -    """List all file and folder entries in `path`."""
          +    """List all file and folder entries in `path`.
          +
          +    Args:
          +        path (str): A directory within a mounted file system. May be relative or
          +            absolute.
          +
          +    Examples:
          +        >>> list_directory('.')
          +
          +    """
               print(f"Files and folders in '{os.path.abspath(path)}':")
               # Quick and easy method for listing items within a single
               # folder.
          @@ -564,6 +627,21 @@ handling the processing of files. This sample shows a method of
           counting the number of files, subdirectories, and files ending in
           “.py” as an example.

          def iterate_files(path):
          +    """Recursively iterate over a path, findings all files within the folder
          +    and its subdirectories.
          +
          +    Args:
          +        path (str): A directory within a mounted file system. May be relative or
          +            absolute.
          +
          +    Examples:
          +        >>> number_of_py_files = 0
          +        >>> for f in iterate_files('../'):
          +        ...     if f.endswith('.py'):
          +        ...         number_of_py_files += 1
          +        >>> print(f"\t{number_of_py_files} python files found "
          +        ...      f"in {os.path.abspath('../')}")
          +    """
               # Though `os.walk()` exposes a list of directories in the
               # current `root`, it is rarely used since we are generally
               # interested in the files found within the subdirectories.
          @@ -572,19 +650,50 @@ counting the number of files, subdirectories, and files ending in
               for root, dirs, files in os.walk(os.path.abspath(path)):
                   # Both `dirs` and `files` are lists containing all entries
                   # at the current `root`.
          -        for fentry in files:
          +        for file_name in files:
                       # To effectively reference a file, you should include
                       # the below line which creates a full path reference
                       # to the specific file, regardless of how nested it is
          -            file_entry = os.path.join(root, fentry)
                       # We can then hand `file_entry` off to other functions.
          -            yield file_entry
          +            yield os.path.join(root, file_name)
           
          -
          -list_directory(path)
          +
          +iterate_files(path)
          +

          Recursively iterate over a path, findings all files within the folder +and its subdirectories.

          +
          +
          Parameters
          +

          path (str) – A directory within a mounted file system. May be relative or +absolute.

          +
          +
          +

          Examples

          +
          >>> number_of_py_files = 0
          +>>> for f in iterate_files('../'):
          +...     if f.endswith('.py'):
          +...         number_of_py_files += 1
          +>>> print(f"    {number_of_py_files} python files found "
          +...      f"in {os.path.abspath('../')}")
          +
          +
          +
          + +
          +
          +list_directory(path)

          List all file and folder entries in path.

          +
          +
          Parameters
          +

          path (str) – A directory within a mounted file system. May be relative or +absolute.

          +
          +
          +

          Examples

          +
          >>> list_directory('.')
          +
          +
          @@ -607,7 +716,7 @@ counting the number of files, subdirectories, and files ending in