我已经写了一些代码,逐行分析.txt文件,但是写得很糟糕。目前,我有脑筋急转弯,我的代码有问题,我的txt文件最后需要空行才能创建正确的最后一组。如果没有此行功能,则将最后一组的名称设置为与最后一组相同。
txt文件如下所示:
time in seconds
addr1,channel1
addr2,channel2
staticval1,channel3
staticval2,channel4
groupname1
addr3,channel5
staticval3,channel6
groupname2
etc
1
239.0.1.104,kanal1
233.51.52.170,kanal2
239.0.1.105,kanal3
1.0,kanal4
2.0,kanal5
grupa12
239.0.1.122,kanal6
239.0.1.116,kanal7
1.5,kanal8
4.5,kanal9
grupa123
239.0.1.119,kanal10
239.0.1.112,kanal11
4.5,KANAL112
4.0,KANAL123
1.5,KANAL134
grupa1234
并且代码是:
with open("INPUT_DATA_SIMULATION.txt", "r") as filestream:
for line in islice(filestream, 0, 1):
scanTime = int(line)
for line in filestream:
currentline = line.split(",")
if not "grupa" in line:
#walk thorugh lines inbetween "groups"
if(currentline != ["\n"]):
for y in range(len(currentline[0])):
if(currentline[0][y] == "."):
valChecker += 1
if(valChecker>=2):
MCAST_ADDRESSES.append(currentline[0])
elif(valChecker<=1):
MCAST_VALUES.append(float(currentline[0]))
valChecker = 0
if("\n" in currentline[1]):
currentline[1] = currentline[1][:-1]
MCAST_NAMES.append(currentline[1])
else:
MCAST_NAMES.append(currentline[1])
#if blank line found break loop
else:
break
elif "grupa" in line:
groupName = line[:-1]
shouldAdd = True
if(shouldAdd):
MCAST_GRP.append(groupName)
MCAST_GRP.append(MCAST_ADDRESSES)
MCAST_GRP.append(MCAST_VALUES)
MCAST_GRP.append(MCAST_NAMES)
MCAST_GROUPS.append(MCAST_GRP)
MCAST_GRP = []
MCAST_ADDRESSES = []
MCAST_VALUES = []
MCAST_NAMES = []
shouldAdd = False
return MCAST_GROUPS, scanTime
我应该如何修改代码以输入格式为:
time in seconds
groupname1
addr1,channel1
static1,channel2
groupname2
addr2,channel3
所以组名在地址和静态值之前,而不是之后?另外修改在行尾删除“ \ n”的部分也很棒。
先谢谢您。
根据要求创建了两个版本
代码遵循原始流程,但进行了一些清理
在每个组之后处理组名
from itertools import islice
import re
import pprint
def get_input(filepath):
with open(filepath, "r") as filestream:
MCAST_ADDRESSES = []
MCAST_NAMES = []
MCAST_VALUES = []
MCAST_GRP = []
MCAST_GROUPS = []
# Various line patterns (capture using regex)
mcast_pattern = re.compile(r"(^(\d{1,3}\.){3}\d{1,3}),(\w+)", re.IGNORECASE)
number_pattern = re.compile(r"(^(^\d+\.\d+),(\w+))$", re.IGNORECASE)
number_pattern = re.compile(r"((^\d+\.\d+),(\w+))$", re.IGNORECASE)
group_pattern = re.compile(r"(grupa\d+)$", re.IGNORECASE)
for line in islice(filestream, 0, 1):
scanTime = int(line)
for line in filestream:
currentline = line.rstrip() # strips off ending "/n"
search = group_pattern.search(currentline)
if not search:
search = mcast_pattern.search(currentline)
if search:
MCAST_ADDRESSES.append(search.group(1)) # ID
MCAST_NAMES.append(search.group(3)) # Name
search = number_pattern.search(currentline)
if search:
MCAST_VALUES.append(search.group(2))
MCAST_NAMES.append(search.group(3))
else:
groupName = search.group(1)
MCAST_GRP.append(groupName)
MCAST_GRP.append(MCAST_ADDRESSES)
MCAST_GRP.append(MCAST_VALUES)
MCAST_GRP.append(MCAST_NAMES)
MCAST_GROUPS.append(MCAST_GRP)
MCAST_GRP = []
MCAST_ADDRESSES = []
MCAST_VALUES = []
MCAST_NAMES = []
return MCAST_GROUPS, scanTime
用法
data, scanTime = get_input(r".\input_simulation\INPUT_DATA_SIMULATION.txt")
print("Scan time: {}".format(scanTime))
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(data)
输出
Scan time: 1
[ [ 'grupa12',
['239.0.1.104', '233.51.52.170', '239.0.1.105'],
['1.0', '2.0'],
['kanal1', 'kanal2', 'kanal3', 'kanal4', 'kanal5']],
[ 'grupa123',
['239.0.1.122', '239.0.1.116'],
['1.5', '4.5'],
['kanal6', 'kanal7', 'kanal8', 'kanal9']],
[ 'grupa1234',
['239.0.1.119', '239.0.1.112'],
['4.5', '4.0', '1.5'],
['kanal10', 'kanal11', 'KANAL112', 'KANAL123', 'KANAL134']]]
在组之前处理组名
from itertools import islice
import re
import pprint
def get_rev_input(filepath):
with open(filepath, "r") as filestream:
MCAST_ADDRESSES = []
MCAST_NAMES = []
MCAST_VALUES = []
MCAST_GRP = []
MCAST_GROUPS = []
# Various line patterns (capture using regex)
mcast_pattern = re.compile(r"(^(\d{1,3}\.){3}\d{1,3}),(\w+)", re.IGNORECASE)
number_pattern = re.compile(r"((^\d+\.\d+),(\w+))$", re.IGNORECASE)
group_pattern = re.compile(r"(grupa\d+)$", re.IGNORECASE)
for line in islice(filestream, 0, 1):
scanTime = int(line)
groupName = ""
for line in filestream:
currentline = line.rstrip() # strips off ending "/n"
search = group_pattern.search(currentline)
if not search:
# Not groupname
search = mcast_pattern.search(currentline)
if search:
MCAST_ADDRESSES.append(search.group(1)) # ID
MCAST_NAMES.append(search.group(3)) # Name
search = number_pattern.search(currentline)
if search:
MCAST_VALUES.append(search.group(2))
MCAST_NAMES.append(search.group(3))
else:
if not groupName:
groupName = search.group(1)
continue
MCAST_GRP.append(groupName)
MCAST_GRP.append(MCAST_ADDRESSES)
MCAST_GRP.append(MCAST_VALUES)
MCAST_GRP.append(MCAST_NAMES)
MCAST_GROUPS.append(MCAST_GRP)
MCAST_GRP = []
MCAST_ADDRESSES = []
MCAST_VALUES = []
MCAST_NAMES = []
# Update group name
groupName = search.group(1)
# Capture Last Group
if groupName:
MCAST_GRP.append(groupName)
MCAST_GRP.append(MCAST_ADDRESSES)
MCAST_GRP.append(MCAST_VALUES)
MCAST_GRP.append(MCAST_NAMES)
MCAST_GROUPS.append(MCAST_GRP)
return MCAST_GROUPS, scanTime
用法
data, scanTime = get_rev_input(r".\input_simulation\revINPUT_DATA_SIMULATION.txt")
print("Scan time: {}".format(scanTime))
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(data)
输出
Scan time: 1
[ [ 'grupa12',
['239.0.1.104', '233.51.52.170', '239.0.1.105'],
['1.0', '2.0'],
['kanal1', 'kanal2', 'kanal3', 'kanal4', 'kanal5']],
[ 'grupa123',
['239.0.1.122', '239.0.1.116'],
['1.5', '4.5'],
['kanal6', 'kanal7', 'kanal8', 'kanal9']],
[ 'grupa1234',
['239.0.1.119', '239.0.1.112'],
['4.5', '4.0', '1.5'],
['kanal10', 'kanal11', 'KANAL112', 'KANAL123', 'KANAL134']]]