GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Can I use GitPython to diff two individual files that are not in a Git repo? · gitpython-developers/GitPython · Discussion #1985

Can I use GitPython to diff two individual files that are not in a Git repo? #1985

Unanswered
roadfar asked this question in Q&A
Can I use GitPython to diff two individual files that are not in a Git repo? #1985
@roadfar roadfar
Dec 11, 2024 · 3 comments
Return to top
Discussion options
  • Uh oh!

    There was an error while loading. Please reload this page.

roadfar
Dec 11, 2024

Can I use GitPython to diff two individual files that are not in a Git repo? Using the Diff class?

You must be logged in to vote
All reactions

Replies: 3 comments

Comment options
  • Uh oh!

    There was an error while loading. Please reload this page.

Byron
Dec 11, 2024
Maintainer

No, but I am sure there are python packages that will do so.

What follows is LLM generated, and seems plausible, but is untested.

How to create a diff of two files in python? The usage of external packages is acceptable.

To create a difference (diff) between two files in Python, you can use the difflib module which is part of the standard library. However, if you're open to using external packages, unidiff is a powerful tool for parsing and generating unified diffs.

Here's how you can do it using both methods:

Using difflib

The difflib module provides classes and functions for comparing sequences, including files. Here’s an example of how to generate a diff between two text files:

import difflib

def compare_files(file1, file2):
    with open(file1, 'r') as f1:
        lines1 = f1.readlines()
    with open(file2, 'r') as f2:
        lines2 = f2.readlines()

    diff = difflib.unified_diff(lines1, lines2, fromfile=file1, tofile=file2)
    return '\n'.join(diff)

if __name__ == "__main__":
    file1 = 'path/to/file1.txt'
    file2 = 'path/to/file2.txt'
    print(compare_files(file1, file2))

Using unidiff

If you need more advanced features or better performance, consider using the unidiff package. You can install it via pip:

pip install unidiff

Here’s an example of how to use unidiff to generate a diff:

from unidiff import PatchedFile

def create_diff(file1, file2):
    with open(file1, 'r') as f1:
        lines1 = f1.readlines()
    with open(file2, 'r') as f2:
        lines2 = f2.readlines()

    diff = difflib.unified_diff(lines1, lines2, fromfile=file1, tofile=file2)
    patch = PatchedFile.from_string('\n'.join(diff))
    return str(patch)

if __name__ == "__main__":
    file1 = 'path/to/file1.txt'
    file2 = 'path/to/file2.txt'
    print(create_diff(file1, file2))

In this example, we first generate the diff using difflib, then parse it with unidiff to get additional functionality if needed.

Explanation

  • difflib: This is straightforward and doesn't require any external dependencies since it's part of Python's standard library. It generates a unified diff, which is a human-readable format showing the differences between two sequences.

  • unidiff: This package provides more features for working with diffs, such as parsing and manipulating patch files. It's useful if you need to perform operations beyond just generating a diff, like applying patches or analyzing changes in detail.

Choose the method that best fits your needs based on whether you want simplicity (using difflib) or additional functionality (using unidiff).

You must be logged in to vote
All reactions
0 replies
Comment options
  • Uh oh!

    There was an error while loading. Please reload this page.

roadfar
Dec 12, 2024
Author

@Byron Thanks a lot! I want to use the four Git diff algorithms (Myers, Minimal, Histogram, and Patience) in Python code, but it seems that no Python module has such APIs.

You must be logged in to vote
All reactions
0 replies
Comment options
  • Uh oh!

    There was an error while loading. Please reload this page.

AlexandrDragunkin
Jun 20, 2025

Here is a working option

import difflib
from unidiff import PatchedFile, PatchSet

def create_diff(file1, file2):
    with open(file1, 'r',encoding='utf-8') as f1:
        lines1 = f1.readlines()
    with open(file2, 'r',encoding='utf-8') as f2:
        lines2 = f2.readlines()

    diff = difflib.unified_diff(lines1, lines2, fromfile=file1, tofile=file2)
    diff_string = ''.join(diff)  
    # patch = PatchedFile.from_string(diff_string)
    patch = PatchSet.from_string(diff_string)
    return str(patch)

if __name__ == "__main__":
    file1 = r"path/to/file1.txt"
    file2 = r"path/to/file2.txt"
    print(create_diff(file1, file2))
    

result

--- c:\REPO\path\to\file1.txt
+++ c:\REPO\path\to\file2.tx
@@ -6021,28 +6021,6 @@
         k3.setucs(k3.k_delete, cursnm)
         if exp_p.result_hh:
             k3.visible(exp_p.parent)
-
-    #-------------------------------------------------------------------------------
-    # cursnm = get_random_name(pref="u")
You must be logged in to vote
All reactions
0 replies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
🙏
Q&A
Labels
None yet
3 participants
@roadfar @Byron @AlexandrDragunkin
Converted from issue

This discussion was converted from issue #1984 on December 11, 2024 10:56.

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.