#!/usr/bin/env python # coding: utf-8 # ## ``Q6.`` ## # # ## ```Perform the following file operations using Python```## # # ## ```a) Traverse a path and display all the files and subdirectories in each level till the deepest level for a given path. Also, display the total number of files and subdirectories.``` # # ## ```b) Read a file contents and copy only the contents at odd lines into a new file.``` ## # ## ----------------------------------------------------------------------------------------------------------------------------- # **Approach to displaying the files and subdirectories in each level** # # 1. Get path information from the user.

# # 2. Check whether the path exists or not.

# # 3. If the path exists, then walk through all the file and subdirectories (including root directory) using os.walk() function.

# # 4. Normalize the paths and count the number of subdirectories and files in each of those subdirectories.

# # 5. Display the names of subdirectories and files in subdirectories (including root directory).

# # # **Below functions are used in the program** # # `os.path.exists(path)` # # Return ```True``` if path refers to an existing path. Returns ```False``` for broken symbolic links. On some platforms, this function may return ```False``` if permission is not granted to access the requested file, even if the path physically exists. # # `os.path.normpath(path)` # # Normalize a pathname by collapsing redundant separators and up-level references so that A//B, A/B/, A/./B and A/foo/../B all become A/B. On Windows, it converts forward slashes to backward slashes. # # `os.walk(topdir[, topdown=True])` # # Generate the file names in a directory tree by walking the tree either top-down (default) or bottom-up (topdown = False). Specifying argument `topdown` is optional. For each directory in the tree rooted at directory `topdir` (including topdir itself), it yields a 3-tuple (`dirpath,` `dirnames,` `filenames`). # # 1. `dirpath` is a string, the path to the directory.

# # 2. `dirnames` is a list of the names of the subdirectories in dirpath (excluding '.' and '..').

# # 3. `filenames` is a list of the names of the non-directory files in dirpath. Note that the names in the lists contain no path components. To get a full path (which begins with top) to a file or directory in dirpath, do os.path.join(dirpath, name).

# # ## ----------------------------------------------------------------------------------------------------------------------------- # **Approach to copy the contents from one file to another file at odd lines** # # 1. Open a file source_file as in_file in read mode.

# # 2. Open a file destination_file as out_file in write mode.

# # 3. To read all the lines of a file use `f.readlines().`

# # 4. Obtain the total number of lines in the file.

# # 5. Check the line number which is not divisible by 2 and then write the contents to out_file else pass.

# ## ------------------------------------------------------------------------------------------------------------------------ # In[1]: import os def display_files(): # Set the directory to start from print("Enter path to traverse: ") root_dir = input() if os.path.exists(root_dir): dir_count = 0 file_count = 0 for dir_name, sub_dir_list, file_list in os.walk(root_dir): print(f"Found directory: {dir_name} \n") # check to ignore starting directory while taking directory count # normpath returns the normalized path eliminating double slashes etc. if os.path.normpath(root_dir) != os.path.normpath(dir_name): dir_count += 1 for each_file_name in file_list: file_count += 1 print(f"File name(s) {each_file_name} \n") print(f"Number of subdirectories are {dir_count} \n") print(f"Number of files are {file_count} \n") display_menu() else: print("Entered path doesn't exist") display_menu() def copy_contents_to_file(): source_file = input("Enter the Source file name: ") print("\n") destination_file = input("Enter the Destination file name: ") print("\n") try: with open(source_file) as in_file, open(destination_file, "w") as out_file: list_of_lines = in_file.readlines() for i in range(0, len(list_of_lines)): if i % 2 != 0: out_file.write(list_of_lines[i]) except IOError: print("Error in file names") print("File contents at odd lines copied to destination file \n") display_menu() def display_menu(): print("Enter your choice") print("Press 1 --> Display files and directories for a given path and their count") print("Press 2 --> Copy the contents present at odd lines to another file") print("Press 3 --> Exit the program") choice = int(input()) if choice == 1: display_files() elif choice == 2: copy_contents_to_file() else: exit() if __name__ == "__main__": display_menu()