正在读取地图文件



我正在读取一个映射文件,并将列格式的数据写入一个文本文件。我写的代码在下面,但它不适合我。

fo = open(filename, "r+")
fu = open("map.txt","w+")
for line in fo:
    if (".data.g" in line):
        fu.write(line)
        print line,
fo.close()
fu.close()
#to remove unwanted data
f = open("map1.txt", "w+")
g = open("map.txt", "r+")
for line in g:
    if((".data " in line) and (".bss" in line) and(".text" in line )):
        break
    else:
        f.write(line)
        f.write('n')
f.close()
g.close()

预期输出为

    2007c04c .data  g_isr_array
    2007c004 .data  g_retry_count
    2007c000 .data  g_pkt_hist_wptr

输入地图文件的格式为

.data          0x2007c000        0x0 G:/SJSUDev_V2/SJSU_Dev/projects/lpc1758_freertos_v2/_build/L4_IO/wireless/src/mesh.o
 .data.g_pkt_hist_wptr
                0x2007c000        0x4 G:/SJSUDev_V2/SJSU_Dev/projects/lpc1758_freertos_v2/_build/L4_IO/wireless/src/mesh.o
 .data.g_retry_count
                0x2007c004        0x1 G:/SJSUDev_V2/SJSU_Dev/projects/ lpc1758_freertos_v2/_build/L4_IO/wireless/src/mesh.o
 .data.g_our_node_id
                0x2007c005        0x1 G:/SJSUDev_V2/SJSU_Dev/projects/ lpc1758_freertos_v2/_build/L4_IO/wireless/src/mesh.o
 .data          0x2007c006        0x0 G:/SJSUDev_V2/SJSU_Dev/projects/ lpc1758_freertos_v2/_build/L4_IO/wireless/src/nrf24L01Plus.o
 .data          0x2007c006        0x0 G:/SJSUDev_V2/SJSU_Dev/projects/ lpc1758_freertos_v2/_build/L4_IO/wireless/src/wireless.o
 .data          0x2007c006        0x0 G:/SJSUDev_V2/SJSU_Dev/projects/ lpc1758_freertos_v2/_build/L4_IO/src/gpio.o
 .data          0x2007c006        0x0 G:/SJSUDev_V2/SJSU_Dev/projects/ lpc1758_freertos_v2/_build/L4_IO/src/io_source.o

我只想读取以".data.g"开头的全局变量,但地址在我的代码无法读取的下一行。

如果数据的格式和顺序是公布的,那么您只需要不以.data:开头的第一行

from itertools import imap
with open("map.txt") as f:
    rows = imap(str.split, f)
    for row in rows:
        if row[0] != ".data":
            a, b = row[0].rsplit(".", 1)
            print(next(rows)[0],a, b)

使用你的输入会给你什么:

('0x2007c000', '.data', 'g_pkt_hist_wptr')
('0x2007c004', '.data', 'g_retry_count')
('0x2007c005', '.data', 'g_our_node_id')

您也可以使用以.data.:开头的行

from itertools import imap
with open("map.txt") as f:
    rows = imap(str.split, f)
    for row in rows:
        if row[0].startswith(".data."):
            a, b = row[0].rsplit(".", 1)
            print(next(rows)[0],a, b)

这会给你同样的结果。

以下是一些步骤:

  1. 使用"with"打开文件

与一起使用

  1. 对于每一行,扫描line[0:7]并与'.data.g'进行比较,看看它是否是您想要的行。如果是,请使用line.split()分割该行,并通过对字符串进行切片来提取.data.之后的部分。要在下一行中获取地址,您需要向前移动一行。请参阅此链接了解如何操作:

Python:对于带有文件的循环,如何在forloop中获取下一行?

一旦你有了那行,做一个字符串分割和切片得到地址。现在,使用所有三个数据项,写入文件。

对于任何符合line[0:7] == '.data.g'标准的行,跳过

示例:

with open('map.txt', 'r') as readF:
  with open('map1.txt', 'w') as writeF:
    for line in readF: 
       if line.startswith('.data.g'):
          try:         # next() can cause StopError, gotta catch it
            row = line.split()
            part_after_data = row[0][6:]
            line = next(ireadF)
            addr = line.split()[0]
            writeF.writeline(addr + ' .data '+ part_after_data )
          except:
            pass

最新更新