2015-12-11 1 views
3

J'ai vu dans une autre question que ("\b") pouvait être utilisé pour supprimer un caractère. Cependant, quand j'ai essayé \b il a seulement mis un espace entre le caractère que j'avais l'intention de supprimer et celui après. Y a-t-il une autre façon de faire un backspace?Utilisation de b en Python 3

(je suis en train de faire un programme qui va écrire un mot, supprimez-le récrire puis un nouveau)

+0

Dépend. "\ b" supprime un caractère mais dépend de l'endroit où il a été imprimé. Avez-vous un exemple? – Brian

Répondre

2

Cela dépend de la borne utilisée et de la façon dont elle interprète le \b, par ex.

print('Text: ABC\b\b\bXYZ') 

dans la console interactive de PyCharm donne:

Text: ABC XYZ 

mais exécuté dans la ligne COMAND (cmd.exe) donne:

Text: XYZ 

Ceci est expliqué plus en détail ici : https://stackoverflow.com/a/19926010/5276734

+0

Que dois-je utiliser pour revenir en arrière s'il est en cours d'exécution dans shell? – Jack

3

'\b' supprime uniquement lors de l'impression à un terminal (et pas nécessairement tous les terminaux, bien commun * NIX coquillages et cmd.exe devrait fonctionner). Si la sortie va dans un fichier (ou ailleurs à part un terminal), il va insérer le caractère ASCII retour arrière littéral.

Si vous écrivez à quoi que ce soit, mais un terminal, la meilleure façon de défaire ce que vous avez serait récemment écrit à être seek en arrière et tronquer loin le bit, vous ne voulez pas, par exemple:

import io 

with open(filename, 'wb') as f: 
    ... Do stuff ... 
    f.write(b'abcdefg') 
    ... Do other stuff that doesn't write to the file ... 
    # Oh no, it shouldn't be abcdefg, I want xyz 
    f.seek(-len(b'abcdefg'), io.SEEK_CUR) # Seek back before bit you just wrote 
    f.truncate() # Remove everything beyond the current file offset 
    f.write(b'xyz') # Write what you really want 

Vous pouvez basculer entre l'écriture de backspaces et la recherche et la tronquage en fonction de la sortie vers un terminal; les objets de type fichier ont le .isatty() method qui renvoie True lorsqu'il est connecté à un terminal, et False sinon. Bien sûr, si vous n'êtes pas connecté à un terminal et que vous n'écrivez pas sur un support de recherche (par exemple, si vous transférez votre programme vers un autre programme), vous êtes bloqué. Une fois que vous avez écrit, c'est fait, vous ne pouvez pas l'annuler dans le cas général (il y a des exceptions impliquant la mise en mémoire tampon, mais elles sont flasques et ne valent pas la peine d'être couvertes).