Understanding absolute and relative paths
The term path means exactly what it sounds like. It shows the steps that need to be taken, into and out of folders, to find a file. Each step on the path is either a folder name, the special name . (which means the current folder), or the special name .. (which means to go back/out into the parent folder).
The terms absolute and relative also have their usual English meaning. A relative path shows where something is relative to some start point; an absolute path is a location starting from the top.
Paths that start with a path separator, or a drive letter followed by a path separator (like C:/foo) on Windows, are absolute. (On Windows there are also UNC paths, which are necessarily absolute. Most people will never have to worry about these.)
Paths that directly start with a file or folder name, or a drive letter followed directly by the file or folder name (like C:foo) on Windows, are relative.
Understanding the «current working directory»
Relative paths are «relative to» the so-called current working directory (hereafter abbreviated CWD). At the command line, Linux and Mac use a common CWD across all drives. (The entire file system has a common «root», and may include multiple physical storage devices.) Windows is a bit different: it remembers the most recent CWD for each drive, and has separate functionality to switch between drives, restoring those old CWD values.
Each process (this includes terminal/command windows) has its own CWD. When a program is started from the command line, it will get the CWD that the terminal/command process was using. When a program is started from a GUI (by double-clicking a script, or dragging something onto the script, or dragging the script onto a Python executable) or by using an IDE, the CWD might be any number of things depending on the details.
Importantly, the CWD is not necessarily where the script is located.
The script’s CWD can be checked using os.getcwd, and modified using os.chdir. Each IDE has its own rules that control the initial CWD; check the documentation for details.
To set the CWD to the folder that contains the current script, determine that path and then set it:
os.chdir(os.path.dirname(os.path.abspath(__file__)))
Verifying the actual file name and path
-
There are many reasons why the path to a file might not match expectations. For example, sometimes people expect
C:/foo.txton Windows to mean «the file namedfoo.txton the desktop». This is wrong. That file is actually — normally — atC:/Users/name/Desktop/foo.txt(replacingnamewith the current user’s username). It could instead be elsewhere, if Windows is configured to put it elsewhere. To find the path to the desktop in a portable way, see How to get Desktop location?.It’s also common to mis-count
..s in a relative path, or inappropriately repeat a folder name in a path. Take special care when constructing a path programmatically. Finally, keep in mind that..will have no effect while already in a root directory (/on Linux or Mac, or a drive root on Windows).Take even more special care when constructing a path based on user input. If the input is not sanitized, bad things could happen (e.g. allowing the user to unzip a file into a folder where it will overwrite something important, or where the user ought not be allowed to write files).
-
Another common gotcha is that the special
~shortcut for the current user’s home directory does not work in an absolute path specified in a Python program. That part of the path must be explicitly converted to the actual path, usingos.path.expanduser. See Why am I forced to os.path.expanduser in python? and os.makedirs doesn’t understand «~» in my path. -
Keep in mind that
os.listdirwill give only the file names, not paths. Trying to iterate over a directory listed this way will only work if that directory is the current working directory. -
It’s also important to make sure of the actual file name. Windows has an option to hide file name extensions in the GUI. If you see
foo.txtin a window, it could be that the file’s actual name isfoo.txt.txt, or something else. You can disable this option in your settings. You can also verify the file name using the command line;dirwill tell you the truth about what is in the folder. (The Linux/Mac equivalent isls, of course; but the problem should not arise there in the first place.) -
Backslashes in ordinary strings are escape sequences. This causes problems when trying to a backslash as the path separator on Windows. However, using backslashes for this is not necessary, and generally not advisable. See Windows path in Python.
-
When trying to create a new file using a file mode like
w, the path to the new file still needs to exist — i.e., all the intervening folders. See for example Trying to use open(filename, ‘w’ ) gives IOError: [Errno 2] No such file or directory if directory doesn’t exist. Also keep in mind that the new file name has to be valid. In particular, it will not work to try to insert a date inMM/DD/YYYYformat into the file name, because the/s will be treated as path separators.
Table of Contents
Hide
- Python FileNotFoundError: [Errno 2] No such file or directory
- Example FileNotFoundError
- Misspelled file name
- Invalid file path or directory path
- Using a relative path
- Solution to FileNotFoundError: [Errno 2] No such file or directory
In Python, when you reference a file, it needs to exist. Otherwise, Python will return a FileNotFoundError: [Errno 2] No such file or directory.
In this tutorial, let’s look at what is FileNotFoundError: [Errno 2] No such file or directory error means and how to solve this in your code.
Python will raise FileNotFoundError when you use the OS library and try to read a file or write a file that does not exist using an open() statement.
It is, of course, excluding you are creating a new file and writing content to the file. Any error message which states FileNotFoundError means that Python cannot find the path of the file you are referencing.
Example FileNotFoundError
The below code will list all the files in a specified folder. We will be using the OS module and os.listdir() method to get a list of files in the specified folder.
import os
for f in os.listdir("/etc"):
print(f)
Output
Traceback (most recent call last):
File "Main.py", line 2, in <module>
for f in os.listdir("/etc/test"):
FileNotFoundError: [Errno 2] No such file or directory: '/etc/test'
Now you can see that Python is throwing FileNotFoundError: [Errno 2] No such file or directory since the folder reference is wrong here.
The possible reasons for this error could be as follows.
Misspelled file name
The error will often occur due to misspelled filenames, so providing the correct file name would solve the issue.
Invalid file path or directory path
Sometimes you might give a wrong file path or directory path which does not exist. It usually happens even with the network path when it’s unreachable. So ensure that the file path is correct and if you are placing the file in the network path, make sure it’s reachable and accessible.
Using a relative path
If you use a relative path, the file would be searched in the current working directory and not in the original path. So ensure you give an absolute path of the file to resolve the error.
Solution to FileNotFoundError: [Errno 2] No such file or directory
We will correct our above code by referencing the proper directory where the file exists. This time, we will also use an absolute path instead of a relative path to ensure it’s referencing the correct directory.
import os
for f in os.listdir("C:/Projects/Tryouts/etc"):
print(f)
Output
python.txt
index.md
Python Data Science Ebook.pdf
Srinivas Ramakrishna is a Solution Architect and has 14+ Years of Experience in the Software Industry. He has published many articles on Medium, Hackernoon, dev.to and solved many problems in StackOverflow. He has core expertise in various technologies such as Microsoft .NET Core, Python, Node.JS, JavaScript, Cloud (Azure), RDBMS (MSSQL), React, Powershell, etc.
Sign Up for Our Newsletters
Subscribe to get notified of the latest articles. We will never spam you. Be a part of our ever-growing community.
By checking this box, you confirm that you have read and are agreeing to our terms of use regarding the storage of the data submitted through this form.
Expected behaviour
Run a program that reads a file stored in the same directory as the program.
Actual behaviour
VS Code is returning the following in the terminal:
Traceback (most recent call last):
File "/Filepath/10-1_learning_python.py", line 3, in <module>
with open(filename) as file_content:
FileNotFoundError: [Errno 2] No such file or directory: 'learning_python.txt'
Steps to reproduce:
I am trying to run a very simple Python program in VS Code. In the same subfolder I have the two following files:
- 10-1_learning_python.py
- learning_python.txt
This is the code in «10-1_learning_python.py»:
filename = 'learning_python.txt'
with open(filename) as file_content:
content = file_content.read()
print(content)
When running the code I get this error:
FileNotFoundError: [Errno 2] No such file or directory: ‘learning_python.txt’
This code works (using the very same directory and files) if I run it in other applications such as SublimeText.
Environment data
I am using macOS Catalina 10.15.5.
My VS Code version is as follows:
Version: 1.45.1
Commit: 5763d909d5f12fe19f215cbfdd29a91c0fa9208a
Date: 2020-05-14T08:33:47.663Z
Electron: 7.2.4
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
OS: Darwin x64 19.5.0Value of the
python.languageServersetting:Microsoft