Der Befehl "file" führt zu "ASCII-Text ohne Zeilenabschlusszeichen", es sei denn, ich bearbeite die Datei zuerst in vim

4623
cor

Ich experimentiere mit einem seltsamen Verhalten, das ich nicht lösen kann. Ich werde das Szenario erklären:

  • Von einem Python-Skript bekomme ich einen Json von einer einfachen Anwendung, die auf parse gehostet wird .
  • Sobald ich den Text erhalten habe, erhalte ich einen Satz daraus und speichere ihn in einer lokalen "txt" -Datei, die er als iso-8859-15 speichert.
  • Schließlich sende ich es an einen Textprozessor, der erwartet, dass er auf ISO-8859-15 empfangen wird

Das Seltsame ist, dass das Python-Skript ausgeführt wird, wenn ich es ausführe

file my_file.txt 

Die Ausgabe ist:

my_file.txt: ASCII text, with no line terminators 

Wenn ich aber my_file.txtmit vim öffne, dann entferne ich den letzten Punkt des Satzes, schreibe ihn erneut und speichere die Datei: wenn ich es noch einmal mache:

file my_file.txt 

jetzt ist die Ausgabe:

my_file.txt: ASCII text 

Dadurch werden einige Probleme bei der Verarbeitung des Sprachsynthesizers gelöst. Wie kann ich dieses Verhalten also automatisch erzwingen, ohne vim Sachen zu machen? Ich habe auch viele Versuche iconvohne Erfolg gemacht.

Jede Hilfe wäre sehr dankbar

Bearbeiten:

i@raspberrypi ~/main $ hexdump -C my_file.txt  00000000 73 61 6d 70 6c 65 20 61 6e 73 77 65 72 2e 2e |sample answer..| 0000000f  pi@raspberrypi ~/main $ file my_file.txt my_file.txt: ASCII text, with no line terminators pi@raspberrypi ~/main $ vim my_file.txt pi@raspberrypi ~/main $ file my_file.txt my_file.txt: ASCII text pi@raspberrypi ~/main $ hexdump -C my_file.txt  00000000 73 61 6d 70 6c 65 20 61 6e 73 77 65 72 2e 2e 0a |sample answer...| 00000010 

Beispieldatei

Python-Code:

import json,httplib from random import randint import codecs  connection = httplib.HTTPSConnection('api.parse.com', 443) connection.connect() connection.request('GET', '/1/classes/XXXX', '', { "X-Parse-Application-Id": "xxxx", "X-Parse-REST-API-Key": "xxxx" }) result = json.loads(connection.getresponse().read())  pos = randint(0,len(result['results'])-1) sentence = result['results'][pos]['sentence'].encode('iso-8859-15') response = result['results'][pos]['response'].encode('iso-8859-15')  text_file = codecs.open("sentence.txt", "w","ISO-8859-15") text_file.write("%s" % sentence) text_file.close()  text_file = open("response.txt","w") text_file.write("%s" % response) text_file.close() 
5
Können Sie die Datei ohne Leitungsabschluss hochladen? Ich möchte es mir gerne ansehen. Nidhoegger vor 8 Jahren 0
Entfernen Sie den Punkt, oder korrigieren Sie ihn bei einer Bearbeitung? Möglicherweise wird beim Bearbeiten der Datei anstelle des Punkts, der das Problem verursacht, der Zeilenende-Marker hinzugefügt. Paul vor 8 Jahren 1
Es ist also eine einzelne Zeile in dieser Textdatei? Und * hat * es einen Leitungsabschluss? Und sind Sie sicher, dass Sie nur den Punkt entfernen? Sie können dies mit 'hexdump -C' bestätigen. Wenn Sie vim eingeben, scheinen die Zeilen immer mit "0x0a" zu enden, auch wenn Sie den Cursor nicht zur nächsten leeren Zeile bewegen können. Ich denke, vim fügt es tatsächlich hinzu, wenn Sie den Punkt entfernen oder bearbeiten. Arjan vor 8 Jahren 0
Danke vielmals! ja, es geht Ihnen gut, nur das Öffnen und Speichern der Datei mit vim reicht aus cor vor 8 Jahren 0
danke @Arjan Ich habe den Beitrag mit den Befehlsergebnissen bearbeitet cor vor 8 Jahren 0
@Nidhoegger Ich habe eine Datei hochgeladen. Steht auf der bearbeiteten Frage. Danke vielmals cor vor 8 Jahren 0
Bitte zeigen Sie dem Python-Code, wie Sie die Zeile bekommen und wie Sie sie schreiben. Ich vermute, dass der Zeilenumbruch beim Schleifen der Eingabe entfernt wird. Alles, was Sie tun müssen, ist, ihn beim Schreiben der Ausgabedatei anzufügen. Bitte geben Sie unbedingt an, ob Sie Python 2 oder 3 verwenden, da sich die Unicode-Verarbeitung zwischen diesen beiden Versionen stark geändert hat. Bram vor 8 Jahren 0
Danke @Bram, da ist es. Python verwenden 2.7.3. Auf zwei verschiedene Arten in eine Datei schreiben, mit demselben Ergebnis. cor vor 8 Jahren 0
Dieses konkrete Beispiel hat also * zwei * Punkte, oder? "0x2e" ist ein Punkt, und das ist im Beispiel zweimal. In der Tat wird das `0x0a` von vim hinzugefügt, auch wenn Sie nichts entfernen, wie Sie es jetzt schon gesehen haben. Arjan vor 8 Jahren 0

2 Antworten auf die Frage

6
Scott Johnson

Der Standard /bin/echokann verwendet werden, um diese neue Zeile für Sie am Ende der Datei hinzuzufügen:

$ echo -n 'ssss'>test $ file test test: ASCII text, with no line terminators $ hexdump -C test  00000000 73 73 73 73 |ssss| 00000004 $ echo >> test $ file test test: ASCII text $ hexdump -C test  00000000 73 73 73 73 0a |ssss.| 00000005 $  

Eine weitere Option wäre, es in Ihren Python-Code einzufügen:

text_file = open("response.txt","w") text_file.write("%s" % response) text_file.write("\n") # <-- newline added here text_file.close() 
Oder: `text_file.write ("% s \ n "% response)` ;-) Arjan vor 8 Jahren 0
@Arjan, so würde ich es wahrscheinlich tun, weil ich es mag, dass die Dinge ultra-prägnant sind, aber ich wollte die zusätzliche Ausführlichkeit zu Illustrationszwecken. :) Scott Johnson vor 8 Jahren 1
3
Bram

Die einfachste Lösung besteht darin, die Newline im Schreibbefehl anzufügen:

text_file.write("%s\n" % sentence) 

Mein Beispielprogramm zu demonstrieren

import codecs sentence = 'something' text_file = codecs.open("sentence.txt", "w","ISO-8859-15") text_file.write("%s" % sentence) text_file.close() text_file = codecs.open("sentence2.txt", "w","ISO-8859-15") text_file.write("%s\n" % sentence) text_file.close() 

Und das Ergebnis:

$ file sentence.txt  sentence.txt: ASCII text, with no line terminators $ file sentence2.txt  sentence2.txt: ASCII text 

Die Erklärung ist, dass die Variable, die Sie schreiben, nicht die Zeilenumbrüche enthält und write()genau schreibt, ob Sie sie angeben .

Danke, es geht! Ihre Antwort könnte perfekt sein, aber Scott war schneller. cor vor 8 Jahren 0