Welcome to Teknozof! If you’ve ever felt overwhelmed by a cluttered downloads folder or wished you could rename a batch of files with a single click, you’re in the right place. In this guide we’ll walk you through writing your very first Python script that can create, move, copy, and delete files—all from the comfort of your terminal. No prior programming experience is required; just a curiosity for automation and a willingness to type a few commands. By the end of the tutorial you’ll have a reusable script, a better understanding of Python’s built‑in os and shutil modules, and the confidence to expand the script for your own workflow.
What You’ll Need
- A computer running Windows, macOS, or Linux.
- Python 3.8 or newer installed (download from python.org if you don’t have it).
- A text editor – VS Code, Sublime Text, or even Notepad will do.
- Basic command‑line knowledge (how to open a terminal and run commands).
- A folder with a few test files you can safely experiment on.
Step 1: Set Up Your Project Folder
First, create a dedicated folder where you’ll keep the script and any test files. Open your terminal and run:
mkdir ~/python_file_manager
cd ~/python_file_manager If you’re on Windows, replace ~/python_file_manager with a path like C:UsersYourNamepython_file_manager. Inside this folder, create a sub‑folder called test_files and drop a handful of dummy files (e.g., doc1.txt, image1.jpg, report.pdf) so you can see the script in action without risking important data.
Step 2: Create the Skeleton of the Script
Open your editor and create a new file named file_manager.py. Start with the usual shebang (optional on Windows) and import the modules we’ll need:
#!/usr/bin/env python3
import os
import shutil
import argparse
# Optional: make the script executable on Unix‑like systems
# chmod +x file_manager.py The argparse module will let us pass options from the command line, keeping the script flexible.
Step 3: Parse Command‑Line Arguments
Below the imports, add a function that defines the arguments our script will accept. For a beginner‑friendly tool we’ll support three actions: list files, move files, and rename files.
def get_args():
parser = argparse.ArgumentParser(
description='Simple file‑management utility written in Python.'
)
parser.add_argument('action', choices=['list', 'move', 'rename'],
help='What you want to do with the files.')
parser.add_argument('source', help='Source directory (or file for rename).')
parser.add_argument('target', nargs='?', default='',
help='Target directory for move, or new name for rename.')
return parser.parse_args()
This setup means you can run commands like python file_manager.py list ./test_files or python file_manager.py move ./test_files ./archive.
Step 4: Implement the Core Functions
Now write three small functions that perform the actions. Keep them simple and add helpful print statements so you can see what’s happening.
def list_files(dir_path):
print(f"Listing files in {dir_path}:")
for entry in os.listdir(dir_path):
full_path = os.path.join(dir_path, entry)
if os.path.isfile(full_path):
print(' -', entry)
def move_files(src_dir, dst_dir):
os.makedirs(dst_dir, exist_ok=True)
print(f"Moving files from {src_dir} to {dst_dir}:")
for entry in os.listdir(src_dir):
src_path = os.path.join(src_dir, entry)
dst_path = os.path.join(dst_dir, entry)
if os.path.isfile(src_path):
shutil.move(src_path, dst_path)
print(' moved', entry)
def rename_file(file_path, new_name):
dir_name = os.path.dirname(file_path)
new_path = os.path.join(dir_name, new_name)
if not os.path.isfile(file_path):
print(f"Error: {file_path} does not exist.")
return
os.rename(file_path, new_path)
print(f"Renamed {os.path.basename(file_path)} to {new_name}")
Notice the use of os.makedirs(..., exist_ok=True) – it creates the destination folder only if it isn’t already there, preventing a FileExistsError.
Step 5: Wire Everything Together
Finally, add the main block that calls the appropriate function based on the user’s choice.
def main():
args = get_args()
if args.action == 'list':
list_files(args.source)
elif args.action == 'move':
move_files(args.source, args.target)
elif args.action == 'rename':
rename_file(args.source, args.target)
if __name__ == '__main__':
main()
Save the file. You now have a functional script that can list, move, or rename files with a single command.
Step 6: Test Your Script and Observe the Output
Open a terminal in the project folder and run a few test commands:
# List the test files
python file_manager.py list ./test_files
# Move them to a new folder called archive
python file_manager.py move ./test_files ./archive
# Rename a single file inside the archive
python file_manager.py rename ./archive/doc1.txt document_one.txt
Each command should print clear, human‑readable feedback. Verify that the files actually moved or renamed by checking the directories with ls (macOS/Linux) or dir (Windows).
Common Mistakes to Avoid
Even a simple script can bite you if you overlook a detail. Here are the most frequent pitfalls beginners encounter:
- Hard‑coding paths. Using absolute paths (e.g.,
C:UsersMeDocuments) makes the script unusable on another machine. Stick to relative paths or let the user supply them via arguments. - Forgetting to check if a file exists. Attempting to move or rename a non‑existent file raises
FileNotFoundError. Ourrename_filefunction demonstrates a quick guard clause; you can add similar checks tomove_files. - Overwriting existing files.
shutil.movewill overwrite a file with the same name in the destination. If you need safety, add a check withos.path.exists(dst_path)before moving. - Running the script without the proper Python version. Some older systems still ship with Python 2.7. Verify you’re using Python 3 by running
python3 --versionorpython --versionand adjust the command accordingly. - Missing execute permission on Unix. After adding the shebang, you must run
chmod +x file_manager.pyto make the script directly executable.
Tips and Tricks
Here are a few extra ideas to make your script more robust and user‑friendly:
- Add a dry‑run mode. Include a
--dry-runflag that prints the actions without actually moving files. This helps prevent accidental data loss. - Support wildcards. Use the
globmodule to let users specify patterns like*.txtfor batch operations. - Log actions to a file. Write each operation to
file_manager.logso you have an audit trail. - Cross‑platform path handling. Rely on
os.path.joinandpathlib.Pathinstead of hard‑coding forward or backward slashes. - Package it. Turn the script into a small command‑line utility with
setuptoolsso you can install it viapip install .and runfilemanagerfrom anywhere.
Frequently Asked Questions
Can I use this script to delete files?
Yes, but be extremely careful. Deleting files is irreversible. You can add a delete action that calls os.remove() after a confirmation prompt.
What if I need to process sub‑directories recursively?
Replace os.listdir() with os.walk(). This yields a generator that walks the directory tree, letting you apply the same logic to nested folders.
Is there a way to rename multiple files with a pattern?
Absolutely. Combine glob to fetch matching files and use str.format() or f‑strings to build new names (e.g., adding a timestamp or sequential number).
Conclusion
Congratulations! You’ve just built a practical Python script that can list, move, and rename files—all from the command line. This foundation opens the door to more sophisticated automation: bulk image conversion, log file archiving, or even a tiny GUI with tkinter. Remember to test on non‑critical data, keep backups, and incrementally add features as you grow more comfortable with Python’s standard library. Happy scripting, and may your folders stay tidy!
Photo by Mohammad Rahmani on Unsplash





