Sample data:-
Group Information:
Name Target Status Role Mode Options
SG_hpux_vgcgloack.r518634 s2976 Started Primary Sync auto_recover,auto_failover,path_management,auto_synchronize,active_active
LocalVV ID RemoteVV ID SyncStatus LastSyncTime
vgcglock_SG_cluster 13496 vgcglock_SG_cluster 28505 Synced NA
Name Target Status Role Mode Options
aix_rcg1_AA.r518634 s2976 Started Primary Sync auto_recover,auto_failover,path_management,auto_synchronize,active_active
LocalVV ID RemoteVV ID SyncStatus LastSyncTime
tpvvA_aix_r.2 20149 tpvvA_aix.2 41097 Synced NA
tpvvA_aix_r.3 20150 tpvvA_aix.3 41098 Synced NA
tpvvA_aix_r.4 20151 tpvvA_aix.4 41099 Synced NA
Name Target Status Role Mode Options
aix_rcg2_AA.r518634 s2976 Started Primary Sync auto_recover,auto_failover,path_management,auto_synchronize,active_active
LocalVV ID RemoteVV ID SyncStatus LastSyncTime
decoA_aix_r.11 20158 decoA_aix.11 41106 Synced NA
decoA_aix_r.12 20159 decoA_aix.12 41107 Synced NA
decoA_aix_r.13 20160 decoA_aix.13 41108 Synced NA
I want to search for line "Name" and the immediate next line and use it as Key: Value.
Code:-
##The file is large and the code not shown here extract the data from Group Information line
##and saves to "no_extra_lines.
# here i am removing the empty lines or empty strings
no_extra_lines = [line for line in required_lines if line.strip() != ""]
print(no_extra_lines)
print(len(no_extra_lines))
#here i want to iterrate over the string and want to extract the line "Name" and the immedite next line.
for num, line in enumerate(no_extra_lines):
print(num, line)
if "Name" in line:
print(line)
print(line 1)
How to print the line and the next line? OR to put it in another way, how can I extract the next set of lines after every occurrence of "Name". The list is huge with the same pattern. I want to extract these 2 lines for every occurance and save as a key-value.
CodePudding user response:
You should extract next line using num
it's an index of current line
for num, line in enumerate(no_extra_lines):
print(num, line)
if "Name" in line:
print(line)
print(no_extract_lines[num 1])
CodePudding user response:
In the string print(line 1)
, you are trying to add a number to the string, and you need to get the next value from the list after the current one. You can do this:
if "Name" in line:
print(line)
print(no_extra_lines[num 1]
CodePudding user response:
Since you have said that 'The list is huge', I would suggest to use an approach that uses iteration only and avoids indexing:
def extract_name_next(lines):
it = (line for line in lines if line.strip() != '')
for line in it:
if line.startswith('Name'):
key = line
try:
value = next(it)
yield key, value
except StopIteration:
raise ValueError('Name must be followd by additional line')
This is a generator function that yields (key, value) pair. To print you can use it like
for key, value in extract_name_next(required_lines):
print(key)
print(value)
You could also construct a dict from these pairs:
mydict = dict(extract_name_next(required_lines))
Note that you could aswell use this generator to extract key,value pairs from e.g. a file, even if the file does not fit into RAM:
with open('huge_file') as file:
mydict = dict(extract_name_next(file))