How to get the name of an open file?
Categories:
How to Get the Name of an Open File in Python

Learn various methods to retrieve the name of an open file or the current script in Python, covering standard library functions and common use cases.
When working with files in Python, it's often necessary to know the name of the file being processed or even the name of the script currently executing. This information can be crucial for logging, error reporting, dynamic path generation, or simply for debugging purposes. Python provides several straightforward ways to achieve this, depending on whether you need the name of the script itself or a file opened within the script.
Getting the Current Script's Name
The most common scenario is needing to know the name of the Python script that is currently running. Python's sys
module, specifically sys.argv
, is the go-to for this. sys.argv
is a list of command-line arguments passed to a Python script. The first element of this list (sys.argv[0]
) is always the name of the script itself.
import sys
import os
# Get the full path of the script
script_full_path = sys.argv[0]
print(f"Full script path: {script_full_path}")
# Get just the script name (basename)
script_name = os.path.basename(script_full_path)
print(f"Script name: {script_name}")
# Get the directory of the script
script_directory = os.path.dirname(script_full_path)
print(f"Script directory: {script_directory}")
Using sys.argv[0]
and os.path
to get script name and path.
os.path.basename()
to extract just the file name from a full path. This ensures cross-platform compatibility and correctly handles paths with directories.Retrieving the Name of an Open File Object
When you open a file using open()
, the resulting file object doesn't directly expose a simple name
attribute that always contains just the filename. However, it does have a name
attribute that stores the path used to open the file. You can then use os.path.basename()
on this attribute to get the actual filename.
import os
# Create a dummy file for demonstration
with open('my_test_file.txt', 'w') as f:
f.write('Hello, world!')
# Open the file and get its name
with open('my_test_file.txt', 'r') as file_obj:
file_path = file_obj.name
file_name = os.path.basename(file_path)
print(f"Opened file path: {file_path}")
print(f"Opened file name: {file_name}")
# Clean up the dummy file
os.remove('my_test_file.txt')
Extracting the name from an open file object.
flowchart TD A[Start Python Script] --> B{Access sys.argv[0]} B --> C[Get Full Script Path] C --> D{Use os.path.basename()} D --> E[Obtain Script Name] A --> F[Open File with open()] F --> G{Access file_obj.name} G --> H[Get Opened File Path] H --> D E --> I[End]
Flowchart illustrating how to get script and opened file names.
Considerations for Different Scenarios
While sys.argv[0]
and file_obj.name
cover most cases, it's important to understand their nuances:
- Interactive Shell/Jupyter Notebooks: In an interactive Python shell or Jupyter Notebook,
sys.argv[0]
might return an empty string or a specific string like'<stdin>'
or'ipykernel_launcher.py'
, as there isn't a traditional script file being executed. For notebooks, you might need specific notebook-related APIs. - Modules vs. Scripts: If your code is imported as a module,
sys.argv[0]
will still refer to the top-level script that initiated the import, not the module itself. To get the name of the current module file, you can use__file__
. __file__
Attribute: The special__file__
attribute holds the pathname of the file from which the module was loaded. This is particularly useful when you need the path of the current module, regardless of whether it's the main script or an imported one. Likesys.argv[0]
, it can be combined withos.path.basename()
.
import os
# Using __file__ to get the current module's path
module_full_path = __file__
print(f"Module full path: {module_full_path}")
module_name = os.path.basename(module_full_path)
print(f"Module name: {module_name}")
module_dir = os.path.dirname(module_full_path)
print(f"Module directory: {module_dir}")
Using __file__
to get the current module's name and path.
__file__
attribute might not be available or might return unexpected values in certain environments, such as when running code directly from a string or in some embedded Python interpreters. Always test its behavior in your specific deployment environment.