2014-11-26 2 views
-1

Я создаю программу, использующую обработку, которая читает txt-файл и отправляет результат в arduino. Я могу получить его, чтобы отправить строку и продолжить обновление, но как только я попытаюсь просто отправить последний символ, это не сработает ... Может ли кто-нибудь помочь мне с этим? В основном мне нужно прочитать последний символ из txt-файла и отправить его как char через последовательный файл в arduino, python или обрабатывать оба будут работать!Только прочитать последний символ в .txt-файле

* Вот мой код [Обработка]

import processing.serial.*; 
import java.io.*; 

int mySwitch=0; 
int counter=0; 
String [] subtext; 
Serial myPort; 

void setup(){ 
    //Create a switch that will control the frequency of text file reads. 
    //When mySwitch=1, the program is setup to read the text file. 
    //This is turned off when mySwitch = 0 
    mySwitch=1; 

    //Open the serial port for communication with the Arduino 
    //Make sure the COM port is correct 
    myPort = new Serial(this, "COM4", 9600); 
    myPort.bufferUntil('\n'); 
} 

void draw() { 
    if (mySwitch>0){ 
     /*The readData function can be found later in the code. This is the call to read a CSV file on the computer hard-drive. */ 
     readData("G:/Personal/control.txt"); 

     /*The following switch prevents continuous reading of the text file, until we are ready to read the file again. */ 
     mySwitch=0; 
    } 

    /*Only send new data. This IF statement will allow new data to be sent to the arduino. */ 
    if(counter<subtext.length){ 
     /* Write the next number to the Serial port and send it to the Arduino There will be a delay of half a second before the command is sent to turn the LED off : myPort.write('0'); */ 
     myPort.write(subtext[counter]); 
     delay(500); 
     myPort.write('0'); 
     delay(100); 

     //Increment the counter so that the next number is sent to the arduino. 
     counter++; 
    } else{ 
     //If the text file has run out of numbers, then read the text file again in 5 seconds. 
     delay(5000); 
     mySwitch=1; 
    } 
} 


/* The following function will read from a CSV or TXT file */ 
void readData(String myFileName){ 

File file=new File(myFileName); 
BufferedReader br=null; 

try{ 
    br=new BufferedReader(new FileReader(file)); 
    String text=null; 

    /* keep reading each line until you get to the end of the file */ 
while((text=br.readLine())!=null){ 
    * Spilt each line up into bits and pieces using a comma as a separator */ 

    subtext = splitTokens(text,","); 
} 
}catch(FileNotFoundException e){ 
    e.printStackTrace(); 
}catch(IOException e){ 
    e.printStackTrace(); 
}finally{ 
    try { 
     if (br != null){ 
      br.close(); 
     } 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
} 

И это данные, которые я имею дело с

[19:54:57] [Сервер нить/INFO]: [ @] б

[19:54:57] [Сервер резьба/INFO]: [@]

[19:54:57] [Сервер резьба/INFO]: [@] б

[19:54:57] [Сервер резьба/INFO]: [@]

[19:54:58] [Сервер резьба/INFO]: [@] б

[19: 54:58] [Сервер резьба/INFO]: [@]

[19:54:59] [Сервер резьба/INFO]: [@] б

[20:30:23] [Сервер нить/INFO]: [@] a

[20:30:24] [Серверная нить/информация]: [@] b

[21:07:34] [Сервер резьба/INFO]: [@]

[21:07:35] [Сервер резьба/INFO]: [@] б

  • Единственное значение, которое я действительно забочусь является/б
  • И этот файл будет постоянно обновляться в этом формате
+6

Покажите нам код и образец файла с полукокса –

+0

Добавлена ​​код и данные, которые я имею дело с :) –

ответ

4

Чтение последнего символа из файла:

with open(filename, 'rb+') as f: 
    f.seek(-1,2) 
    print f.read() 

Seek является объектом Обработка файлов комментарий

file.seek (смещение позиции)

  1. смещение:. Сколько символов вам нужно (то есть) 1 означает, что один символ
  2. postion: Сообщите, где должна начинаться операция чтения/записи файла.
    1. 0 означает начало файла
    2. 1 означает текущее положение файла чтения/записи курсора
    3. 2 означает конец файла

f.seek (-1,2) означает перейти к концу файла и пройти назад один элемент

print f.read() выводит значение, полученное из команды искать

+0

Я не понимаю, как это работает? –

+0

импорт ОС с открытым ('G: \ Личные \ control.txt', 'гь +'), как F: \t f.seek (-1,2) \t печати f.read (1) , как это? –

+0

Объяснение параметра 'offset' можно немного переформулировать. В настоящее время создается впечатление, что 'offset' определяет, сколько байтов считывается при следующем вызове' read', что верно только в этом конкретном контексте (потому что мы читаем все до конца файла). Кроме того, '2' можно заменить на os.SEEK_END, чтобы сделать его более читаемым, а режим' + 'на самом деле не нужен, так как файл не изменяется, только читать. – quasoft

1

Что я сделал:

  1. Открыли файл.
  2. Прочитать последнюю строку как список.
  3. Преобразует его в строку и считывает последний символ и печатает в.

    a=open('does&donts.txt','rb') 
    lines = a.readlines() 
    a.close() 
    if lines: 
        last_line = lines[-1] 
    print last_line 
    b="".join(last_line) 
    print b[-1:] 
    

Надеется, что это помогает

+1

Нет необходимости читать весь файл только ради одного символа, используйте 'file.seek'. – bereal

0

Ответа Стефана прост и виду работ, но не учитывает текстовые файлы с:

  • UTF-8 кодирование, содержащие не -Английские символы (которые являются кодировкой по умолчанию для текстовых файлов в Python 3)
  • один символ новой строки в конце файла (который по умолчанию в редакторах Linux как vim или gedit)

Если текстовый файл содержит не английские символы, ни один из ответов, представленных до сих пор работал бы.

Далее следует пример, который решает обе проблемы.

import os 


def get_last_utf8_char(filename, ignore_newlines=True): 
    """ 
    Reads the last character of a UTF-8 text file. 
    :param filename: The path to the text file to read 
    :param ignore_newlines: Set to true, if the newline character at the end of the file should be ignored 
    :return: Returns the last UTF-8 character in the file or None, if the file is empty 
    """ 
    with open(filename, 'rb') as f: 
     last_char = None 

     # Reads last 4 bytes, as the maximum size of an UTF-8 character is 4 bytes 
     num_bytes_to_read = 4 

     # If ignore_newlines is True, read two more bytes, as a newline character 
     # can be up to 2 bytes (eg. \r\n) 
     # and we might have a newline character at the end of file 
     # or size bytes, if file's size is less than 4 bytes 
     if ignore_newlines: 
      num_bytes_to_read += 2 

     size = os.fstat(f.fileno()).st_size 
     f.seek(-min(num_bytes_to_read, size), os.SEEK_END) 
     last_bytes = f.read() 

     # Find the first byte of a UTF-8 character, starting 
     # from the last byte 
     offset = -1 
     while abs(offset) <= len(last_bytes): 
      b = last_bytes[offset] 
      if ignore_newlines and b in b'\r\n': 
       offset -= 1 
       continue 
      if b & 0b10000000 == 0 or b & 0b11000000 == 0b11000000: 
       # If this is first byte of a UTF8 character, 
       # interpret this and all bytes after it as UTF-8 
       last_char = last_bytes[offset:].decode('utf-8') 
       break 
      offset -= 1 

     if last_char and ignore_newlines: 
      last_char = last_char.replace('\r', '').replace('\n', '') 

     return last_char 

Как это работает:

  • читает только последние несколько байт в кодировке UTF-8 кодируются текстовый файл в двоичном режиме
  • итерацию байты назад, отыскивая началом UTF- 8 символов
  • После символа (отличного от символа новой строки) найден, вернуть, что в качестве последнего символа в текстовом файле

Пример текстового файла - bg.txt:

Здравей свят 

Как использовать:

>>> get_last_utf8_char('bg.txt') 
т 

Это работает как с UTF-8 и ASCII кодируются файлы.

0

Простейшая вещь, которую я мог придумать:

s="".join(list(open(rfile_directory))) 
pos=s[-1:] 

шаги:

  1. открыл файл
  2. превращали его в список
  3. Вступил в список ул образуют
  4. получил последнего персонажа!

Теперь, если персонаж находится в розыске в междунар виде, просто:

pos=int(s[-1:]) 
Смежные вопросы