Working with Files & Directories in Python
Last updated:- Write string to file
- Read file into string
- Buffered reading
- Process file line by line
- Check file 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 just one 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: This will break if the file doesn't fit in memory
with open("filename.txt","r") as f:
contents = f.read()
# use variable `contents`
Buffered reading
Process a large text file, but without without loading it all to memory at the same time (buffered reading)
This is easy with python:
with open("path/to/file") as f:
for line in f:
# process the line
You can also use f.readline()
to read a whole line (dangerous if the file has no line breaks) or f.read(size)
, which takes an argument indicating the maximum number of bytes to be read into memory.
Process file line by line
See above: Buffered Reading
Check file exists
This method returns True
if the given path exists and it's a file.
If you just want to test if a path exists (be it a 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
List files in directory
To show all files that exist 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
I.e. for file in directory, do something.
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
To loop over all files recursively under some path (i.e. 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(<source-path>, <target-path>)
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"