Difflib - Understanding difflib.Differ in Python

The `difflib` module in Python provides a powerful tool for comparing sequences of lines and generating human-readable differences or deltas. Within this module, the `Differ` class stands out as a key component for comparing text-based data. In this article, we'll explore the functionality of `difflib.Differ` and how it aids in highlighting differences between sequences.

Key Concepts

Comparison CodesThe Differ class utilizes a set of two-letter codes to signify the meaning of each line in the delta. These codes include the following.

'- ': Line unique to sequence 1.

'+ ': Line unique to sequence 2.

'  ': Line common to both sequences.

'? ': Line not present in either input sequence.

Intraline DifferencesLines starting with '?' are designed to draw attention to intraline differences, providing insight into character-level variations within similar lines.

Handling WhitespaceCaution is advised when dealing with sequences containing whitespace characters (e.g., spaces, tabs, line breaks), as these may affect the interpretation of differences.

Example Usage

import difflib
before_code = '''
#include <stdio.h>
int main() {
int num1, num2;
char operator;
printf("Enter first number: ");
scanf("%d", &num1);
printf("Enter operator (+, -, *, /): ");
scanf(" %c", &operator);
printf("Enter second number: ");
scanf("%d", &num2);
switch (operator) {
case '+':
printf("Result: %d\n", num1 + num2);
break;
case '-':
printf("Result: %d\n", num1 - num2);
break;
case '*':
printf("Result: %d\n", num1 * num2);
break;
case '/':
if (num2 != 0) {
printf("Result: %.2f\n", (float)num1 / num2);
} else {
printf("Error: Division by zero is not allowed.\n");
}
break;
default:
printf("Error: Invalid operator.\n");
break;
}
return 0;
}
'''
after_code = '''
#include <stdio.h>
int main() {
int num1, num2;
char operator;
// Validate user input
if (scanf("%d %c %d", &num1, &operator, &num2) != 3) {
printf("Invalid input. Please try again.\n");
return 1;
}
// Check for valid operator
if (operator != '+' && operator != '-' && operator != '*' && operator != '/') {
printf("Invalid operator. Please try again.\n");
return 1;
}
// Check for division by zero
if (operator == '/' && num2 == 0) {
printf("Error: Division by zero is not allowed.\n");
return 1;
}
// Perform calculation
int result;
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
printf("Invalid operator. Please try again.\n");
return 1;
}
// Output result
printf("Result: %d\n", result);
return 0;
}
'''
# Split the code into lines
before_lines = before_code.splitlines()
after_lines = after_code.splitlines()
# Perform the difference analysis
differ = difflib.Differ()
diff = list(differ.compare(before_lines, after_lines))
# Extract the changed blocks
changed_blocks = []
current_block = []
for line in diff:
if line.startswith(' '):
if current_block:
changed_blocks.append(current_block)
current_block = []
else:
current_block.append(line)
# Add the last block if any
if current_block:
changed_blocks.append(current_block)
# Display the changed blocks
for block in changed_blocks:
print("\n".join(block))
print("***************")
view raw main.py hosted with ❤ by GitHub

Understanding how to use `difflib.Differ` empowers Python developers to efficiently compare and analyze textual data, identify discrepancies between sequences, and ultimately enhance the clarity of differences in their applications.

Comments

Popular posts from this blog

Difflib