Команда «file» выдает «ASCII-текст без разделителей строки», если я сначала не отредактирую файл в vim

4605
cor

Я экспериментирую со странным поведением, которое не знаю, как решить. Я объясню сценарий:

  • Из скрипта Python я получаю JSON из простого приложения, размещенного на синтаксическом анализе .
  • Получив текст, я получаю из него предложение и сохраняю его в локальный файл "txt", сохраняя его как iso-8859-15.
  • Наконец я отправляю его текстовому речевому процессору, который ожидает его получения по ISO-8859-15

Странно то, что, как только скрипт Python запускается, если я запускаю

file my_file.txt 

Выход:

my_file.txt: ASCII text, with no line terminators 

Но если я открою my_file.txtс помощью vim, то уберу последнюю «точку» предложения, запишу ее снова и сохраню файл: если я сделаю снова:

file my_file.txt 

Теперь вывод:

my_file.txt: ASCII text 

Что решает некоторые проблемы при обработке синтезатора голоса. Итак, как я могу принудительно заставить это поведение без выполнения vim? Я также сделал много попыток, iconvно безуспешно.

Любая помощь приветствуется

Редактировать:

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 

Образец файла

Код 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() 
5
Можете ли вы загрузить файл без разделителей строки? Я хотел бы взглянуть на это. Nidhoegger 9 лет назад 0
Это удаляет «точку», или любое редактирование исправляет это? Возможно, редактирование файла добавляет маркер конца строки, а не точку, вызывающую проблему. Paul 9 лет назад 1
Так что это одна строка в этом текстовом файле? И * есть ли у нее терминатор строки? И ты уверен, что только удаляешь точку? Вы можете проверить с помощью `hexdump -C`. При вводе в vim строки всегда заканчиваются на `0x0a`, даже если вы не можете переместить курсор на следующую пустую строку. Так что я думаю, что vim действительно добавляет его, когда вы удаляете точку или делаете какие-либо изменения. Arjan 9 лет назад 0
большое спасибо! да, все в порядке, достаточно просто открыть и сохранить файл с помощью vim cor 9 лет назад 0
спасибо @Arjan Я отредактировал пост с результатами команды cor 9 лет назад 0
@Nidhoegger Я загрузил файл. Есть на отредактированный вопрос. Большое спасибо cor 9 лет назад 0
Пожалуйста, покажите код Python, как вы получаете строку и как вы ее пишете. Я подозреваю, что перевод строки зацикливается на вводе, и все, что вам нужно сделать, это добавить его при записи выходного файла. Пожалуйста, не забудьте указать, используете ли вы Python 2 или 3, так как обработка Unicode сильно изменилась между этими двумя версиями. Bram 9 лет назад 0
Спасибо @Bram, вот оно. Использование python 2.7.3. Запись в файл двумя различными способами с одинаковым результатом. cor 9 лет назад 0
Так что в этом конкретном примере даже есть * две * точки, верно? `0x2e` - точка, и это в примере дважды. Но действительно, `0x0a` добавляется vim, даже если вы ничего не удаляете, как вы уже видели. Arjan 9 лет назад 0

2 ответа на вопрос

6
Scott Johnson

The standard /bin/echo can be used to add that newline to the end of the file for you:

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

Another option would be to add it in your Python code:

text_file = open("response.txt","w") text_file.write("%s" % response) text_file.write("\n") # <-- newline added here text_file.close() 
Или: `text_file.write ("% s \ n "% response)` ;-) Arjan 9 лет назад 0
@Arjan, наверное, я бы так и сделал, потому что мне нравится, чтобы все было очень кратким, но я хотел, чтобы здесь было много подробностей в иллюстративных целях. :) Scott Johnson 9 лет назад 1
3
Bram

The simplest solution is to append the newline in the write command:

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

My sample program to demonstrate

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

And the result:

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

The explanation is that the variable you are writing does not contain the newline and write() writes exactly hat you give it.

Спасибо, это работает! Ваш ответ может быть верным, но Скотт был быстрее. cor 9 лет назад 0

Похожие вопросы