Files and folders: Exercise and Solution
An interactive file browser
Excercise
You're going to build an interactive file browser! The program starts by listing all files and folders in the current working directory. The first entry in the list is a special entry that corresponds to the parent folder, called '..' (two dots is the standard way to indicate the parent folder); however, this entry is only available if the working directory isn't the root already! Each entry in the list is numbered, starting from 0.
By entering a number, the user can select a file or folder. Depending on what kind of file or folder it is, one of three things can happen:
- If the user selects a folder or the '..' entry, the working directory is changed to that folder.
- If the user selects a text file, the content of that file is printed out.
- If the user selects a binary file, ·the message '[file name] is not a text file' is printed out
Next, the contents of the working directory (which may have changed) are shown again, and the user is prompted to provide new input, and so on, until the user enters quit
. If the user enters something other than quit
or a number that corresponds to an entry in the list, an informative warning message (such as 'Invalid user input') is printed out.
An interaction could look like this:
Listing contents of /home/sebastiaan/coding
0: ..
1: python
>>> 1
Listing contents of /home/sebastiaan/coding/python
0: ..
1: exercise1.py
2: exercise2.py
>>> quit
Tips:
Path.cwd()
returns the working directoryos.chdir()
changes the working directory- Calling
Path.read_text()
on a binary file results in aUnicodeDecodeError
Solution
import os
from pathlib import Path
while True:
# Build a list of files and folders in the working directory.
entries = []
current_folder = Path.cwd()
# If we're not already in the root, the first entry is the parent folder
if current_folder.parent != current_folder:
entries.append(Path('..'))
entries += current_folder.glob('*')
# Print a numbered list of files and folders
print(f'Listing contents of {current_folder}')
for i, path in enumerate(entries):
print(f'{i}: {path.name}')
# Get user input. Valid input is the word 'quit' or a number that corresponds
# to an index in the list of files and folders
user_input = input('>>> ')
if user_input == 'quit':
break
try:
selection = int(user_input)
except ValueError:
print('Invalid user input (please enter a number)')
continue
if selection >= len(entries):
print('Invalid user input (invalid number)')
continue
# If the selected path is a folder, then change the working directory to
# that folder
selected_path = Path(entries[selection])
if selected_path.is_dir():
os.chdir(selected_path)
continue
# Otherwise, try to read the file contents as if they are text. If this fails
# print a warning message
try:
file_contents = selected_path.read_text()
except UnicodeDecodeError:
print(f'{selected_path.name} is not a text file')
continue
# Otherwise print the file contents
print(file_contents)
You're done with this section!
Continue with Files and folders >>