我正在读取一个映射文件,并将列格式的数据写入一个文本文件。我写的代码在下面,但它不适合我。
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)
这会给你同样的结果。
以下是一些步骤:
- 使用"with"打开文件
与一起使用
- 对于每一行,扫描
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