2016-07-15 12 views
1

ich dieses kleine Stück Code für meine Art von Betriebssystem:„ n“ in Strings nicht funktioniert

print("Type your document below.") 
print("Press enter to save.") 
print("Type \\n for a new line.") 
file=input() 
print("Enter a file name...") 
filename=input() 
outFile = open(filename, "w+") 
outFile.write(file) 
outFile.close() 

aber wenn ich diesen Code ausführen (die in einer def ist), sage ich etwas eingeben wie dieser:

weil tritt nicht funktionieren, wenn die Eingabe von den Benutzern empfangen, so müssen Sie \ n verwenden.

die Datei stellt sich heraus, wie:

foo \n bar 

statt:

foo 
bar 
+0

in einer Zeichenfolge verhindert, dass tatsächlich eine neue Zeile erstellt wird, und anstelle von "Typ (neue Zeile) für eine neue Zeile" ist "Typ \ n für eine neue Zeile". – Xtreme

Antwort

1

Wie Martijn erklären Sie sich den Ersatz verarbeiten müssen. Der einfachste Weg, dies zu tun, ist buchstäblich mit der .replace Methode:

>>> print(input('Enter \\n for newline: ').replace('\\n', '\n')) 
Enter \n for newline: This is my \nnewline 
This is my 
newline 

Dies wird für die \n Escape-Sequenz funktionieren, aber wenn Sie andere wollen (zum Beispiel \t), dann werden Sie das selbst implementieren müssen.

+0

Vielen Dank, und was ist mit dem Schreiben in eine Datei? Würde das Gleiche funktionieren? – Xtreme

+0

Ich bin mir nicht sicher, was Sie fragen. Warum versuchst du es nicht? –

+0

es hat funktioniert, danke – Xtreme

5

\n ist eine Escape-Sequenz, die in Stringliterale funktioniert nur. input() nimmt kein Zeichenfolgenliteral, nimmt den Text, den der Benutzer eingibt, und führt keine Verarbeitung aus, so dass jeder, der \ gefolgt von n eingibt, eine Zeichenfolge aus zwei Zeichen, einem umgekehrten Schrägstrich und dem Buchstaben n, kein Zeilenumbruch erzeugt.

Sie werden Ihre eigene Verarbeitung solcher zu tun haben, entkommt selbst:

file = file.replace(r'\n', '\n') 

Hier verwendete ich einen rohen Stringliteral, die auch nicht entkommt Sequenzen unterstützen den Backslash \ gefolgt zu definieren, indem a n.

Alternativ fragen wiederholt Benutzer für einen neuen Dateinamen, bis sie fertig sind:

lines = [] 
print('Type in your document, followed by a blank line:') 
while True: 
    line = input("> ") 
    if not line: 
     break 
    lines.append(line) 
file = '\n'.join(lines) 

Demo:

>>> lines = [] 
>>> print('Type in your document, followed by a blank line:') 
Type in your document, followed by a blank line: 
>>> while True: 
...  line = input("> ") 
...  if not line: 
...   break 
...  lines.append(line) 
... 
> foo 
> bar 
> 
>>> lines 
['foo', 'bar'] 
>>> '\n'.join(lines) 
'foo\nbar' 
+0

und wie würde ich das tun? – Xtreme

1

Beachten Sie, dass, wenn Sie wollen Python-Strings unterstützen (mit nicht nur \n sondern auch \t, \r, \u1234, etc.), Sie codecs.decode mit dem unicode_escape Handler verwenden sollte:

contents = input() 
contents = codecs.decode(contents, "unicode_escape") 

Beachten Sie, dass dies wird

foo\nbar\\nbash\u1234 

zu

ändern

Sie werden auch Fehler behandeln wollen.Sie können dies tun, indem UnicodeDecodeError Caching oder durch eine Fehlerersetzungsstrategie verwenden:

contents = input() 
contents = codecs.decode(contents, "unicode_escape", errors="replace") 

Leider scheint dies zu Chaos mit Unicode-Zeichen:

codecs.decode(r"α", "unicode_escape") 
#>>> 'α' 

Die einfachste fix Ich weiß, mit der ist es, zunächst zu entkommen raw_unicode_escape:

contents = input() 
contents = codecs.encode(r"α", "raw_unicode_escape") 
contents = codecs.decode(inp, "unicode_escape") 

Dies ist wahrscheinlich kompliziert weit mehr ist, als Sie brauchen, so schlage ich nicht wirklich das zu tun.