【问题标题】:How to iterate lines from a text file in python?如何从python中的文本文件中迭代行?
【发布时间】:2016-11-30 11:03:18
【问题描述】:

我更新了我的问题,因为起初我认为我有最好的解决方案但是,直到现在我才知道。这是我执行时的错误。我认为错误来自文件 C 中的循环。

我正在尝试从文本文件“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
....................

如果您能帮助我,我将不胜感激。

【问题讨论】:

    标签: python c uart


    【解决方案1】:

    您可能希望执行以下操作:

    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每次读取一行,因此对较大的文件有效。

    【讨论】:

    • 我个人会使用with open("your_file", "r") as f: for line in f: do_something(line)。这避免了在异常情况下不关闭文件的可能性。
    • @DaanTimmer 我同意。我个人不经常使用“with”关键字,但这是一种更好的做法。
    • 很抱歉,它只工作一次然后我又加密了一行
    • 第二个代码被剪断应该开始with open("your_file") as f:
    • 我已经更正了,f = open(r'C:\\Users\\user\\Plaintxt.txt', 'r') 或者如您所见,谢谢
    【解决方案2】:

    在你的 for 循环中

    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)
    

    【讨论】:

    • 是的,我知道 ;-) 只是认为它说的是 readline ;-) 而不是 readline_s_
    • @jonie83,你的意思是我必须删除例如 print(clear_msg) 吗??
    【解决方案3】:

    根据this,调用 readlines() 会使您的代码变慢、不那么明确、不那么简洁,完全没有任何好处。

    无需关闭即可打开文件的好方法是使用while

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

    line 是一个包含文件所有行的列表。您可以像在列表中一样迭代并获取任何条目

    【讨论】:

    • 它给我的分割线错误,就像它无法读取任何行
    • 什么样的错误。分割线是为了确保您不会得到 \n 字符。
    • 对不起,这是我的语法错误,但它仍然只给我一行。
    【解决方案4】:

    问题是python文件中的空格:for循环必须包含

           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
    

    我的问题解决了。非常感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多