Exercise: Eliminate Empty/Comment-Only Lines

Write a program distill.py that takes a filename from the commandline.

  • Open that file for reading

  • Output (to stdout) every line that …

    • … is not empty (i.e., does not entirely consist of whitespace)

    • … does not entirely consist of a Python style comment (and is otherwise empty)

Example

Take as a test case the following content, and write it into a file distill-test.txt (or download it).

# whole-line comment
visible content     # though with a comment
		
the previous line contains two TAB characters
      starts at column >0, but is visible

the previousline is entirely empty

         # comment

Run your program distill.py on that file. The program’s output should look as follows.

$ python distill.py distill-test.txt
visible content     # though with a comment
the previous line contains two TAB characters
      starts at column >0, but is visible
the previousline is entirely empty

Dependencies

cluster_python Python Programming cluster_python_exercises Exercises cluster_python_exercises_legacy Exercises (Legacy) cluster_python_basics Python: The Language Fundamentals cluster_python_misc Python: Miscellaneous Topics python_exercises_legacy_function_primeness Exercise: Primeness (Function) python_exercises_legacy_max_numbers_function Exercise: Determine Maximum of Two Numbers (Function) python_exercises_legacy_function_primeness->python_exercises_legacy_max_numbers_function python_basics_python_0270_functions Functions python_exercises_legacy_function_primeness->python_basics_python_0270_functions python_basics_python_0139_commandline_argv Commandline Arguments (sys.argv) python_exercises_legacy_function_primeness->python_basics_python_0139_commandline_argv python_exercises_legacy_max_numbers Exercise: Determine Maximum of Two Numbers python_exercises_legacy_mixed_list_executable Exercise: Mixed List (Executable Program) python_exercises_legacy_max_numbers->python_exercises_legacy_mixed_list_executable python_basics_python_0170_if The if Statement python_exercises_legacy_max_numbers->python_basics_python_0170_if python_basics_python_0140_variables Variables python_exercises_legacy_max_numbers->python_basics_python_0140_variables python_exercises_legacy_max_numbers->python_basics_python_0139_commandline_argv python_exercises_legacy_distill Exercise: Eliminate Empty/Comment-Only Lines python_exercises_legacy_revert Exercise: Reverting Lines of a File python_exercises_legacy_distill->python_exercises_legacy_revert python_basics_python_0500_files File I/O python_exercises_legacy_distill->python_basics_python_0500_files python_exercises_legacy_distill->python_basics_python_0139_commandline_argv python_exercises_legacy_uniq_function Exercise: Function: uniq() python_exercises_legacy_uniq_function->python_exercises_legacy_function_primeness python_exercises_legacy_uniq_function->python_basics_python_0270_functions python_basics_python_0150_datatypes_overview_compound Compound Datatypes python_exercises_legacy_uniq_function->python_basics_python_0150_datatypes_overview_compound python_exercises_legacy_for_primeness Exercise: Primeness (for) python_exercises_legacy_while_primeness Exercise: Primeness (while) python_exercises_legacy_for_primeness->python_exercises_legacy_while_primeness python_basics_python_0225_range The range Function python_exercises_legacy_for_primeness->python_basics_python_0225_range python_basics_python_0220_for for Loops python_exercises_legacy_for_primeness->python_basics_python_0220_for python_exercises_legacy_max_numbers_function->python_exercises_legacy_max_numbers python_exercises_legacy_max_numbers_function->python_exercises_legacy_for_primeness python_exercises_legacy_max_numbers_function->python_basics_python_0270_functions python_exercises_legacy_join_function Exercise: Functions: join() python_exercises_legacy_join_function->python_exercises_legacy_uniq_function python_basics_python_0150_datatypes_overview Datatypes python_exercises_legacy_join_function->python_basics_python_0150_datatypes_overview python_exercises_legacy_join_function->python_basics_python_0270_functions python_exercises_legacy_join_function->python_basics_python_0150_datatypes_overview_compound python_exercises_legacy_cmdline_digit Exercise: Digit to English Word python_exercises_legacy_cmdline_digit->python_basics_python_0150_datatypes_overview python_basics_python_0120_helloworld Hello World python_exercises_legacy_cmdline_digit->python_basics_python_0120_helloworld python_exercises_legacy_cmdline_digit->python_basics_python_0139_commandline_argv python_exercises_legacy_cmdline_digit->python_basics_python_0150_datatypes_overview_compound python_exercises_legacy_python_0350_exercises Exercise: String (Right-Justify) python_exercises_legacy_python_0350_exercises->python_exercises_legacy_join_function python_basics_python_0310_strings_formatting String Formatting python_exercises_legacy_python_0350_exercises->python_basics_python_0310_strings_formatting python_basics_python_0300_strings More About Strings python_exercises_legacy_python_0350_exercises->python_basics_python_0300_strings python_basics_python_0320_strings_methods Miscellaneous String Methods python_exercises_legacy_python_0350_exercises->python_basics_python_0320_strings_methods python_exercises_legacy_mixed_list_interactive Exercise: Mixed List (Interactive Interpreter) python_exercises_legacy_mixed_list_executable->python_exercises_legacy_mixed_list_interactive python_basics_python_0160_boolean Boolean python_exercises_legacy_mixed_list_executable->python_basics_python_0160_boolean python_exercises_legacy_mixed_list_executable->python_basics_python_0150_datatypes_overview python_exercises_legacy_mixed_list_executable->python_basics_python_0140_variables python_exercises_legacy_mixed_list_executable->python_basics_python_0120_helloworld python_exercises_legacy_mixed_list_executable->python_basics_python_0150_datatypes_overview_compound python_exercises_legacy_while_primeness->python_exercises_legacy_cmdline_digit python_basics_python_0193_while while Loops python_exercises_legacy_while_primeness->python_basics_python_0193_while python_exercises_legacy_while_primeness->python_basics_python_0139_commandline_argv python_exercises_legacy_wc Exercise: Counting Lines, Words, Characters python_exercises_legacy_revert->python_exercises_legacy_wc python_exercises_legacy_revert->python_basics_python_0500_files python_exercises_legacy_revert->python_basics_python_0139_commandline_argv python_exercises_legacy_wc->python_exercises_legacy_python_0350_exercises python_exercises_legacy_wc->python_basics_python_0500_files python_exercises_legacy_wc->python_basics_python_0139_commandline_argv python_exercises_legacy_mixed_list_interactive->python_basics_python_0160_boolean python_exercises_legacy_mixed_list_interactive->python_basics_python_0150_datatypes_overview python_exercises_legacy_mixed_list_interactive->python_basics_python_0140_variables python_exercises_legacy_mixed_list_interactive->python_basics_python_0150_datatypes_overview_compound python_basics_python_0160_boolean->python_basics_python_0150_datatypes_overview python_basics_python_0310_strings_formatting->python_basics_python_0300_strings python_basics_python_0170_if->python_basics_python_0160_boolean python_basics_python_0150_datatypes_overview->python_basics_python_0140_variables python_basics_python_0300_strings->python_basics_python_0150_datatypes_overview python_basics_python_0200_sequential_types Sequential Datatypes python_basics_python_0300_strings->python_basics_python_0200_sequential_types python_basics_python_0250_refs_flat_deep_copy References, (Im)mutability python_basics_python_0300_strings->python_basics_python_0250_refs_flat_deep_copy python_basics_python_0193_while->python_basics_python_0160_boolean python_basics_python_0193_while->python_basics_python_0170_if python_basics_python_0500_files->python_basics_python_0220_for python_misc_encoding Encoding python_basics_python_0500_files->python_misc_encoding python_basics_python_0200_sequential_types->python_basics_python_0150_datatypes_overview_compound python_basics_python_0110_blahblah Blahblah python_basics_python_0320_strings_methods->python_basics_python_0300_strings python_basics_python_0130_syntax_etc Syntax etc. python_basics_python_0140_variables->python_basics_python_0130_syntax_etc python_basics_python_0270_functions->python_basics_python_0150_datatypes_overview python_basics_python_0270_functions->python_basics_python_0140_variables python_basics_python_0225_range->python_basics_python_0200_sequential_types python_basics_python_0225_range->python_basics_python_0220_for python_basics_python_0120_helloworld->python_basics_python_0110_blahblah python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0150_datatypes_overview python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0140_variables python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0150_datatypes_overview_compound python_basics_python_0130_syntax_etc->python_basics_python_0120_helloworld python_basics_python_0139_commandline_argv->python_basics_python_0130_syntax_etc python_basics_python_0125_running Running Python Programs python_basics_python_0139_commandline_argv->python_basics_python_0125_running python_basics_python_0220_for->python_basics_python_0193_while python_basics_python_0220_for->python_basics_python_0200_sequential_types python_basics_python_0125_running->python_basics_python_0120_helloworld python_basics_python_0150_datatypes_overview_compound->python_basics_python_0150_datatypes_overview python_misc_encoding->python_basics_python_0150_datatypes_overview python_misc_encoding->python_basics_python_0320_strings_methods