Search code examples
pythonstring-comparison

Python write function output to file


I'm sorry if this is silly question but I have no much Python experience

I have function for comparing files

def compare_files(file1, file2):
    fname1 = file1
    fname2 = file2

    # Open file for reading in text mode (default mode)
    f1 = open(fname1)
    f2 = open(fname2)
    # Print confirmation
    #print("-----------------------------------")
    #print("Comparing files ", " > " + fname1, " < " +fname2, sep='\n')
    #print("-----------------------------------")

    # Read the first line from the files
    f1_line = f1.readline()
    f2_line = f2.readline()

    # Initialize counter for line number
    line_no = 1

    # Loop if either file1 or file2 has not reached EOF

    while f1_line != '' or f2_line != '':

       # Strip the leading whitespaces
      f1_line = f1_line.rstrip()
      f2_line = f2_line.rstrip()

      # Compare the lines from both file
      if f1_line != f2_line:

         ########## If a line does not exist on file2 then mark the output with + sign
        if f2_line == '' and f1_line != '':
            print ("Line added:Line-%d" % line_no + "-"+ f1_line)
         #otherwise output the line on file1 and mark it with > sign
        elif f1_line != '':
            print ("Line changed:Line-%d" % line_no + "-"+ f1_line)


        ########### If a line does not exist on file1 then mark the output with + sign
        if f1_line == '' and f2_line != '':
            print ("Line removed:Line-%d" % line_no + "-"+ f1_line)
          # otherwise output the line on file2 and mark it with < sign
         #elif f2_line != '':
            #print("<", "Line-%d" %  line_no, f2_line)

         # Print a blank line
         #print()

    #Read the next line from the file
      f1_line = f1.readline()
      f2_line = f2.readline()
      #Increment line counter
      line_no += 1

    # Close the files
    f1.close()
    f2.close()

I want to print function output to a text file

result=compare_files("1.txt", "2.txt")

print (result)
Line changed:Line-1-aaaaa
Line added:Line-2-sss
None

i tried following:

f = open('changes.txt', 'w')

f.write(str(result))

f.close

but only None is printed to changes.txt

I'm using "workaround" sys.stdout but wonder is there any other way instead of redirecting print output.

If in function output I specify return instead of print then I'm getting only first output line (Line changed:Line-1-aaaaa) to changes.txt


Solution

  • Because you are not returning anything by default the function returns None so that is reflected in your changes.txt file. you can create a variable that stores the output that you wanted and returns it.

    def compare_files(file1, file2):
        fname1 = file1
        fname2 = file2
    
        # Open file for reading in text mode (default mode)
        f1 = open(fname1)
        f2 = open(fname2)
    
        output_string = ""
    
        # Print confirmation
        # print("-----------------------------------")
        # print("Comparing files ", " > " + fname1, " < " +fname2, sep='\n')
        # print("-----------------------------------")
    
        # Read the first line from the files
        f1_line = f1.readline()
        f2_line = f2.readline()
    
        # Initialize counter for line number
        line_no = 1
    
        # Loop if either file1 or file2 has not reached EOF
    
        while f1_line != '' or f2_line != '':
    
            # Strip the leading whitespaces
            f1_line = f1_line.rstrip()
            f2_line = f2_line.rstrip()
    
            # Compare the lines from both file
            if f1_line != f2_line:
    
                ########## If a line does not exist on file2 then mark the output with + sign
                if f2_line == '' and f1_line != '':
                    print("Line added:Line-%d" % line_no + "-" + f1_line)
                    output_string += "Line added:Line-%d" % line_no + "-" + f1_line + "\n"
                # otherwise output the line on file1 and mark it with > sign
                elif f1_line != '':
                    print("Line changed:Line-%d" % line_no + "-" + f1_line)
                    output_string += "Line changed:Line-%d" % line_no + "-" + f1_line +"\n"
    
                ########### If a line does not exist on file1 then mark the output with + sign
                if f1_line == '' and f2_line != '':
                    print("Line removed:Line-%d" % line_no + "-" + f1_line)
                    output_string += "Line removed:Line-%d" % line_no + "-" + f1_line +"\n"
                # otherwise output the line on file2 and mark it with < sign
                # elif f2_line != '':
            # print("<", "Line-%d" %  line_no, f2_line)
    
            # Print a blank line
            # print()
    
            # Read the next line from the file
            f1_line = f1.readline()
            f2_line = f2.readline()
            # Increment line counter
            line_no += 1
    
        # Close the files
        f1.close()
        f2.close()
        return output_string