“file” produz “texto ASCII, sem terminadores de linha”, a menos que eu primeiro edite o arquivo no vim

5

Estou experimentando um comportamento estranho que não sei como resolver. Vou explicar o cenário:

  • A partir de um script Python, estou obtendo um json de um aplicativo simples hospedado em análise .
  • Assim que recebo o texto, recebo uma frase dele e salve-o em um arquivo "txt" local, salvando-o como iso-8859-15.
  • Finalmente eu envio para um texto para processador de fala, que espera recebê-lo em ISO-8859-15

O estranho é que uma vez que o script python é executado, se eu corro

file my_file.txt

A saída é:

my_file.txt: ASCII text, with no line terminators

Mas se eu abrir my_file.txt com o vim, remova o último "ponto" da sentença, escreva-o novamente e salve o arquivo: se eu fizer novamente:

file my_file.txt

agora a saída é:

my_file.txt: ASCII text

O que resolve alguns problemas ao processar o sintetizador de voz. Então, como posso forçar esse comportamento automaticamente sem fazer o material vim? Eu também fiz muitas tentativas com iconv sem sucesso.

Qualquer ajuda seria muito apreciada

Editar:

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

Arquivo de amostra

Código Python:

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()
    
por cor 17.10.2015 / 11:09

2 respostas

6

O padrão /bin/echo pode ser usado para adicionar essa nova linha ao final do arquivo para você:

$ 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
$ 

Outra opção seria adicioná-lo ao seu código Python:

text_file = open("response.txt","w")
text_file.write("%s" % response)
text_file.write("\n")  # <-- newline added here
text_file.close()
    
por 17.10.2015 / 12:49
3

A solução mais simples é acrescentar a nova linha no comando write:

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

Meu programa de amostra para demonstrar

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()

E o resultado:

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

A explicação é que a variável que você está escrevendo não contém a nova linha e write() escreve exatamente o que você deu.

    
por 17.10.2015 / 13:02