Managing File I/O and System Paths in Python
The built-in open() function initializes a stream to interact with external files, returning a file object that serves as the interface for reading or writting data. If the target resource cannot be accessed, an OSError is raised. It is critical to release system resources by closing the file object once operations are complete.
Opening Streams and Modes
The standard invocation requires the file path and an access mode. While the basic syntax accepts two arguments, additional parameters allow control over buffering, encoding, and error handling.
def read_log_entries(log_location):
# Using context manager ensures automatic closure
with open(log_location, mode='r', encoding='utf-8') as stream:
return stream.read()
Common access modes include:
- 'r': Read-only access (default). Fails if the file does not exist.
- 'w': Write-only. Creates a new file or truncates an existing one.
- 'x': Exclusive creation. Fails if the file already exists.
- 'a': Append mode. Writes data to the end of the file without truncation.
- 'b': Binary mode. Used for non-text files (e.g., images).
- 't': Text mode (default). Handles string data.
- '+': Updates mode. Allows both reading and writing.
File Object Operations
Once a file object is instantiated, several methods manipulate the content and cursor position.
| Method | Description |
|---|---|
close() |
Terminates the connection to the file. |
read(size) |
Retrieves size bytes/characters. If omitted, reads untill EOF. |
readline() |
Fetches a single line including the newline character. |
write(text) |
Inserts the string text at the current cursor position. |
writelines(list) |
Writes a list of strings without adding separators. |
seek(offset, whence) |
Moves the cursor. whence 0 is start, 1 is current, 2 is end. |
tell() |
Returns the current byte position of the cursor. |
truncate(size) |
Resizes the file to size bytes. |
Example of pointer manipulation:
with open('data_stream.bin', 'rb') as binary_file:
binary_file.seek(0, 2) # Jump to end of file
file_size = binary_file.tell()
binary_file.seek(0, 0) # Return to start
header = binary_file.read(10)
Operating System Interface
The os module provides functions for interacting with the underlying operating system, particularly for directory management and environment variables.
Directory and File Management
os.getcwd(): Retrieves the absolute path of the current working directory.os.chdir(path): Changes the current working directory to the specified path.os.listdir(path): Returns a list of names in the given directory.os.mkdir(path): Creates a single directory. Raises error if it exists.os.makedirs(path): Creates nested directories recursively.os.remove(path): Deletes a specific file.os.rmdir(path): Removes an empty directory.os.removedirs(path): Recursively removes empty directories.os.rename(src, dst): Renames a file or directory.os.walk(top): Generates directory tree tuples(dirpath, dirnames, filenames).
Path Utilities
The os.path submodule handles path string manipulations platform-independently.
basename(path): Extracts the final component (filename) from a path.dirname(path): Extracts the directory portion of a path.join(path, *paths): Joins path components intelligently using the correct separater.split(path): Splits into(head, tail)tuple.splitext(path): Splits into(root, extension)tuple.getsize(path): Returns file size in bytes.getmtime(path): Returns the timestamp of the last modification.
Path Inspection
Boolean checks verify the state of filesystem objects:
exists(path): True if the path refers to an existing file or directory.isfile(path): True if the path is an existing regular file.isdir(path): True if the path is an existing directory.isabs(path): True if the path is absolute.islink(path): True if the path is a symbolic link.samefile(path1, path2): True if both paths point to the same inode/file.
import os
def process_safe_path(target):
if os.path.exists(target) and os.path.isfile(target):
size = os.path.getsize(target)
print(f"File size: {size} bytes")
else:
print("Target not found or is not a file")
Platform-specific constants are also available, such as os.sep for the path separator character and os.linesep for the line ending string used by the OS.