Working with Files & Directories in Python
Last updated:- Write string to file
- Read file into string
- Buffered reading
- Check file exists
- Check directory exists
- List files in directory
- Loop over files in directory
- Loop over files in directory, recursively
- Delete file
- Move/rename file
- Copy file
- Add directory to system PATH
All examples assume Python 3, unless otherwise stated
Write string to file
write
is a method of class File
. See all here
# will be overwritten if it already exists!
with open("filename.txt","w") as f:
f.write("foo bar")
Read file into string
Heads-up: Will crash if the file doesn't fit in memory. See Buffered Reading
with open("filename.txt","r") as f:
contents = f.read()
# use variable `contents`
Buffered reading
Process text files line by line without loading it all to memory at once:
with open("path/to/file") as f:
for line in f:
# process the line
You can also use f.readline()
to read a whole line1 or f.read(size)
, which takes an argument indicating the maximum number of bytes to be read into memory.
Check file exists
Returns True
if the given path exists and it's a file.
To test if a path exists (file, directory or even link), use os.path.exists()
instead.
import os.path
path_to_file = "/path/to/file"
if os.path.isfile(path_to_file):
# it exists, and it is a regular
# (i.e. not a directory) file
Check directory exists
import os
# path is either absolute or relative to working dir
os.path.isdir(path_to_directory)
List files in directory
To show all files in a directory, use os.listdir(path_to_directory)
:
import os
os.listdir(path_to_directory)
>>> ['file1.txt', 'file2.json', 'myfile.png']
Loop over files in directory
for file in directory
import os
root_path = "/path/to/directory"
for file_name in os.listdir(root):
# /path/to/directory/myfile.txt
full_path_to_file = os.path.join(root, file_name)
Loop over files in directory, recursively
Loop over all files recursively under a path (including subdirectories):
import os
# you may omit trailing slashes
# i.e. '/tmp' works too
path = '/tmp/'
for root, directories, filenames in os.walk(path):
for directory in directories:
directory_path = os.path.join(root, directory)
# do something with directory_path
for filename in filenames:
file_path = os.path.join(root, filename)
# do something with directory_path
Delete file
Use os.remove(<path-to-file>)
.
import os
# raises FileNotFoundError if file doesn't exist
os.remove("/path/to/file")
Move/rename file
Use: os.replace(from, to)
import os
# raises FileNotFoundError if source file doesn't exist
os.replace('/path/to/source/file','/path/to/new/location/file')
Copy file
Use: shutil.copy(<from>,<to>)
and shutil.copy2(<from>,<to>)
. Both methods are used the same way. See differences below.
Shutil is part of Python's standard library; there's no need to install anything.
Method | Copies file data | Copies file permissions | Copies file creation and modfication dates |
---|---|---|---|
shutil.copy | YES | YES | NO |
shutil.copy2 | YES | YES | YES |
Example 1: Target path is the full path to the new location
import shutil source_path = '/path/to/source/source-file' target_path = '/path/to/target/target-file' # raises FileNotFoundError if source file doesn't exist # target file is overwritten if it already exists! shutil.copy(source_path,target_path) # >>> '/path/to/target/target-file'
Example 2: Target path is the path to the new directory
import shutil source_path = '/path/to/my-file' target_path = '/path/to/another/directory/' # raises FileNotFoundError if source file doesn't exist # target file is overwritten if it already exists! shutil.copy(source_path,target_path) # >>> '/path/to/another/directory/my-file'
Add directory to system PATH
That is, the PATH
environment variable.
import os
os.environ["PATH"] += os.pathsep + "/path/to/directory"
1: This equates to reading the whole file into memory if the file has no line breaks