2016-11-30 2 views
1

Я обновляю свой вопрос, потому что сначала я думаю, что у меня есть лучшее решение. Но у меня его нет до сих пор. Это была моя ошибка в исполнении. Я думаю, что ошибка исходит из цикла, в то время как в файле C.Как перебирать строки из текстового файла в python?

Я пытаюсь читать строки из текстового файла «Plaintext.txt».

e0370734313198a2885a308d3243f6a8 
ccddeeff8899aabb4455667700112233 
8e73b0f7da0e6452c810f32bc4567a22 

В настоящее время она содержит буксирные тросы, я ставлю только два, чтобы сделать простой тест, но я должен положить более 1000 текстов (означает более 1000 строк) Я хочу, чтобы прочитать каждую строку затем отправить его в UART, где я буду делать шифрование для каждого открытого текста (алгоритм шифрования в C): Это мой сценарий:

отредактировать его, как вы сказать мне, но я до сих пор шифрование одной линии

import string 
import serial 
import time 
from array import array 
import struct 
import binascii 

ser = serial.Serial(
        port='COM4',\ 
        baudrate=230400,\ 
        parity=serial.PARITY_NONE,\ 
        stopbits=serial.STOPBITS_ONE,\ 
        bytesize=serial.EIGHTBITS,\ 
        timeout=0) 

f = open(r'C:\\Users\\user\\Plaintxt.txt', 'r') 
for a in f: 
    plaintxt_16b=a[0:32] 
    plaintext=binascii.unhexlify(plaintxt_16b) 
    clear_msg=b'\x24'+b'\x73'+b'\x10'+plaintext 

ser.write(clear_msg) 
time.sleep(0.4) 

while True: 
    print(ser.read(70)) 
ser.close()    # close ports 

В файле C:

while(1) 
    { 
     int rx_length = dev_uart_ptr->uart_read((void*)rx_buffer, 19); 

     if (rx_length <19) 
     { 

      if (rx_buffer[0]=='\x24') 
      { 
       if (rx_buffer[1]=='\x73') 
       { 
        if (rx_buffer[2]=='\x10') 
        { 
         plaintext[0] = (rx_buffer[3] << 24) | 
           (rx_buffer[4] << 16) | 
           (rx_buffer[5] << 8) | 
           rx_buffer[6]; 
         plaintext[1] = (rx_buffer[7] << 24) | 
           (rx_buffer[8] << 16) | 
           (rx_buffer[9] << 8) | 
           rx_buffer[10]; 
         plaintext[2] = (rx_buffer[11] << 24) | 
           (rx_buffer[12] << 16) | 
           (rx_buffer[13] << 8) | 
           rx_buffer[14]; 
         plaintext[3] = (rx_buffer[15] << 24) | 
           (rx_buffer[16] << 16) | 
           (rx_buffer[17] << 8) | 
           rx_buffer[18]; 

         xprintf("**************************\n"); 
         xprintf("%8x %8x %8x %8x \n",plaintext[0],plaintext[1],plaintext[2],plaintext[3]); 
         aes2_set_msg((unsigned int *)plaintext); /** Reset AES message buffer */ 
         aes2_set_key128((unsigned int *)key128); /** Put the key 128 into AES */ 
         /** Configure AES register to enable IRQ and ENCODE */ 
         regs_aes2_ptr-> CFG = AES2_CFG_ENC_DEC_BIT | AES2_CFG_IRQ_MASK_BIT; 
         /** Reset AES internaly */ 
         regs_aes2_ptr-> CTRL = AES2_CTRL_SWRESET_BIT; 

#if DEBUG 
         xprintf("Go encrypt..\n"); 
#endif 
         /** Start the ENCODE function */ 
         regs_aes2_ptr-> CTRL = AES2_CTRL_START_BIT; 

         while(!aes2_irq_flag); /** Wait for irq flag */ 
         aes2_irq_flag=0; /** Reset irq flag */ 

#if DEBUG 
         xprintf("Encrypt done..\n"); 
#endif 

         aes2_get_msg((unsigned int *)ciphertext); /** Retrieve encrypted message */ 
         xprintf("%8x %8x %8x %8x \n",ciphertext[0],ciphertext[1],ciphertext[2],ciphertext[3]); 
         xprintf("**************************\n"); 

        } 
        else 
        { 
         printf ("false"); 
        } 

       } 
       else 
       { 
        printf ("false"); 
       } 
      } 

     } 

    }// End While 

}//end of C_Entry 

Таким образом, проблема в том, что он принимает только последнюю строку и повторите все время такое же шифрование этой линии:

$************************** 
ccddeeff 8899aabb 44556677 112233 
Go encrypt.. 
Encrypt do 
ne.. 
d6e4d64b 27d8d055 c5c7573a 8df4e9aa 
************************** 
****************** 
******** 
ccddeeff 8899aabb 44556677 112233 
Go encrypt.. 
Encrypt done.. 
d6e4d64b 27d 
8d055 c5c7573a 8df4e9aa 
************************** 
************************** 
ccddeeff 
8899aabb 44556677 112233 
Go encrypt.. 
Encrypt done.. 
d6e4d64b 27d8d055 c5c7573a 8df 
4e9aa 
************************** 
************************** 
ccddeeff 8899aabb 44556677 
    112233 
Go encrypt.. 
Encrypt done.. 
d6e4d64b 27d8d055 c5c7573a 8df4e9aa 
********** 
**************** 
************************** 
ccddeeff 8899aabb 44556677 112233 
Go enc 
rypt.. 
Encrypt done.. 
d6e4d64b 27d8d055 c5c7573a 8df4e9aa 
.................... 

Я бы очень признателен, если вы могли бы мне помочь.

ответ

0

Проблемы были пространство в питона файл: для цикла сусла содержит

 ser.write(clear_msg) 
     time.sleep(0.4) 
     print(ser.read(70)) 

К этому пути, он не будет принимать только последний открытый текст из файла открытого текста.

import string 
import serial 
import time 
from array import array 
import struct 
import binascii 

ser = serial.Serial(
        port='COM4',\ 
        baudrate=230400,\ 
        parity=serial.PARITY_NONE,\ 
        stopbits=serial.STOPBITS_ONE,\ 
        bytesize=serial.EIGHTBITS,\ 
        timeout=0) 

f = open(r'C:\\Users\\user\\Plaintxt.txt', 'r') 
for a in f: 
    plaintxt_16b=a[0:32] 
    plaintext=binascii.unhexlify(plaintxt_16b) 
    clear_msg=b'\x24'+b'\x73'+b'\x10'+plaintext 
    ser.write(clear_msg) 
    time.sleep(0.4) 
    print(ser.read(70)) 
ser.close()    # close ports 

У меня проблема. Большое спасибо за Вашу помощь.

2

Вы можете сделать следующим образом:

f = open("your_file", "r") 
for line in f: 
    do_something(line) 
f.close() 

или комментарий указывал:

with open("your_file", "r") as f: 
    for line in f: 
     do_something(line) 

Python будет перебирать каждую строку и дать строку строки в качестве переменной строки здесь , Таким образом, вы можете обрабатывать каждую строку в файле. Кроме того, python читает по одной строке каждый раз, поэтому он эффективен для больших файлов.

+1

Я лично использовал бы 'с открытым (« ваш_файл »,« r ») как f: для строки в f: do_something (строка)'. Это позволяет избежать возможности не закрывать файл в случае исключений. –

+0

@DaanTimmer Согласен. Я лично не использую «с» ключевое слово очень часто, но это более эффективная практика. – Musen

+0

Мне очень жаль, это работает только один раз, после чего я возвращаю шифрование на одну строку. – nani92

0

Во время цикла для

for a in range (0,2): 

    line_array=lines[a] 
    plaintxt_16b=line_array[0:32] 

    plaintext=binascii.unhexlify(plaintxt_16b) 
    clear_msg=b'\x24'+b'\x73'+b'\x10'+plaintext 

вашей перезаписи переменной clear_msg в каждой итерации. Как только вы покинете цикл, оно содержит последнее значение. В вашем случае последняя строка (зашифрована). Затем вы отправляете переменную clear_msg несколько раз без изменения его содержания. Вы должны отступ следующего блока, а также:

print(clear_msg) 
ser.write(clear_msg) 
time.sleep(0.4) 
+0

удален комментарий, неверно прочитал 'readlines' для' readline' –

+0

Нет. Readlines() возвращает список всех строк. – jonie83

+0

Да, я знаю ;-) Просто подумал, что он сказал readline ;-), а не readline_s_ –

0

По this, называя readlines() делает ваш код медленнее, менее явным, менее лаконичен для абсолютно никакой пользы.

Хороший подход, чтобы открыть файл без необходимости его закрытия является использование while

with open(file) as f: 
    line = f.read().splitlines() 

line является список, содержащий все строки файла.Вы можете перебирать и получить любую запись, как вы могли бы сделать в списке

+0

Это дает мне ошибки с этими разделительными линиями, это похоже на то, что он не может прочитать какую-либо строку. – nani92

+0

Какие ошибки. Разделительные линии там, чтобы гарантировать, что вы не получите символ '\ n'. –

+0

Извините, это была синтаксическая ошибка от меня, но она по-прежнему дает мне только одну строку. – nani92

Смежные вопросы