Je suis désolé si c'est une question idiote mais je n'ai pas beaucoup d'expérience Python
J'ai une fonction pour comparer des fichiers
f = open('changes.txt', 'w') f.write(str(result)) f.close
Je veux imprimer la sortie de la fonction sur un fichier texte
result=compare_files("1.txt", "2.txt") print (result) Line changed:Line-1-aaaaa Line added:Line-2-sss None
J'ai essayé de suivre:
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()
mais seul None est imprimé sur changes.txt
J'utilise "contournement" sys.stdout mais je me demande s'il existe un autre moyen au lieu de rediriger la sortie d'impression.
Si dans la sortie de la fonction, je spécifie return au lieu de print, alors je ne reçois que le premier ligne de sortie (Ligne modifiée: Line-1-aaaaa) en changes.txt
4 Réponses :
Votre fonction 'compare_files' ne renvoie rien et donc rien n'est écrit dans le fichier. Faites de la fonction " retour " quelque chose et cela devrait fonctionner.
j'ai écrit en question que si j'ajoute un retour, une seule ligne est retournée
Votre fonction ne renvoie rien, vous imprimez donc "Aucun". Si vous voulez que toute l'impression aille dans un fichier au lieu de stdout comme il le fait par défaut, vous pouvez chane chaque instruction d'impression comme vous l'avez fait à la valeur de retour.
Ou vous pouvez utiliser la redirection pour tout le programme comme dans ici .
Comme vous ne renvoyez rien par défaut, la fonction renvoie Aucun
, ce qui est reflété dans votre fichier changes.txt
. vous pouvez créer une variable qui stocke la sortie souhaitée et la renvoie.
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
Votre compare_files ()
s’imprime, mais ne transmet rien à son appelant.
Si vous voulez transmettre un élément à l’appelant, vous utilisez retour
. Le flux de votre fonction s'arrête là.
Si vous voulez passer plusieurs éléments à l'appelant, vous les cédez
. L'utilisation de yield
transforme votre fonction en fonction de générateur. L'appel d'une fonction génératrice produit un objet générateur qui peut être itéré.
Exemple:
def produce_strings(): for i in ['a', 'b', 'c']: yield i + "x" result = "\n".join(produce_strings()) print(result) # prints a line end separated string made of "ax", "bx" and "cx".
L'instruction
return
est manquante dans la fonctioncompare_files
.j'ai écrit en question que si j'ajoute un retour, une seule ligne est retournée
@script Si vous voulez "retourner" plusieurs entrées, vous devez les
céder
, en transformant la fonction en fonction de générateur et en la traitant comme ça.Il semble qu'il vous manque beaucoup de connaissances de base ... le moyen le plus simple pour vous, je crois, est de faire la redirection dans shell. par exemple.
python votre_script.py> fichier_sortie.txt
. Un autre moyen simple consiste à ajouter cette ligne à une liste au lieu d 'imprimer
dans votre fonction de comparaison. A la fin de la fonction, retournez la liste. Ensuite, vous aurez le retour de la fonction étant le "résultat de la comparaison" (en texte), et l'appelant pourra alors l'enregistrer dans un fichier (ou l'imprimer ou autre). (Generator etc semble trop compliqué pour vous maintenant)