/ / Index bricht in einem Set - Python

Index bricht in einem Set - Python

Ich schreibe ein Python-Skript, das eine Textdatei wie folgt als Eingabe verwendet:

0   A   (*) Begin
1   A
2   A
3   A
4   A
5   A   (*) End
0   B   (*) Begin
1   B
2   B
3   B
4   B
5   B
6   B   (*) End
0   B   (*) Begin
1   B
2   B   (*) End
0   B   (*) Begin
1   B
2   B
3   B
4   B   (*) End

Jetzt möchte ich die Ausgabe wie folgt erhalten:

0   A   (*) Begin [0]
1   A
2   A
3   A
4   A
5   A   (*) End [0]
0   B   (*) Begin [0]
1   B
2   B
3   B
4   B
5   B
6   B   (*) End [0]
0   B   (*) Begin [1]
1   B
2   B   (*) End [1]
0   B   (*) Begin [2]
1   B
2   B
3   B
4   B   (*) End [2]

das wäre die Übersetzung von:

>>>A = [0,1,2,3,4,5]
>>>A
[0, 1, 2, 3, 4, 5]
>>>len(A)
6
>>>B = [(0,1,2,3,4,5,6), (0,1,2), (0,1,2,3,4)]
>>>B
[(0,1,2,3,4,5,6), (0,1,2), (0,1,2,3,4)]
>>>len(B[0])
7
>>>len(B[1])
3
>>>len(B[2])
5

Ich habe es auf diese Weise versucht:

import sys, os
import os.path

txtdir = os.path.dirname(os.path.abspath(__file__))
path = os.path.join(txtdir, "txt/")

textfile = "%sfile.txt" % (path)
with open(textfile,"r") as f:
# read a LIST of rows into "data"
data = f.readlines()

previous_col = ""
current_col = ""
for row in data:
match_1 = "(*) Begin"
match_2 = "(*) End"
if (match_1 in row or match_2 in row):
col = row.split()
print col
print len(col)

if (col[3] == "End"):
previous_col = col[1]
elif (col[3] == "Begin"):
current_col = col[1]

i = 0
if current_col:
if (col[3] == "Begin" and current_col == previous_col):
i += 1 # increment
col[3] = "Begin [%s]" % (i)
else:
col[3] = "Begin [0]"

# and write everything back
with open(textfile, "w") as f:
f.writelines( data )

# close f file
f.close()

Aber es gibt keine Änderung in "file.txt"

Können Sie mir etwas vorschlagen?

Danke vielmals,

Riccardo

Antworten:

2 für die Antwort № 1

Abgesehen von dem offensichtlichen Problem, auf das Paul Lo hingewiesen hat, dass Sie nicht updaten data Liste überhaupt, Sie sind meiner Meinung nach zu komplizieren, können Sie dies einfach tun collections.Counter:

from collections import Counter

c = Counter()

with open("file.txt") as f, open("outfile.txt", "w") as out:
for line in f:
# In `if` and `elif`, use the current value of the counter
# for the second column, default is 0.
if "(*) Begin" in line:
text = line.split(None, 2)[1]
out.write("{}[{}]n".format(line.strip(), c[text]))
elif "(*) End" in line:
text = line.split(None, 2)[1]
out.write("{}[{}]n".format(line.strip(), c[text]))
# End found, so now increment the counter
c[text] += 1
else:
out.write(line)

Auch um die gleiche Datei vor Ort zu ändern, würde ich empfehlen, die fileinput Modul:

from collections import Counter
import fileinput

c = Counter()

for line in  fileinput.input("file1.txt", inplace=True):
if "(*) Begin" in line:
text = line.split(None, 2)[1]
print "{}[{}]".format(line.strip(), c[text])
elif "(*) End" in line:
text = line.split(None, 2)[1]
print "{}[{}]".format(line.strip(), c[text])
# End found, so now increment the counter
c[text] += 1
else:
print line,

Ausgabe:

0   A   (*) Begin[0]
1   A
2   A
3   A
4   A
5   A   (*) End[0]
0   B   (*) Begin[0]
1   B
2   B
3   B
4   B
5   B
6   B   (*) End[0]
0   B   (*) Begin[1]
1   B
2   B   (*) End[1]
0   B   (*) Begin[2]
1   B
2   B
3   B
4   B   (*) End[2]

1 für die Antwort № 2

Du hast viel gearbeitet for row in data, aber du hast wirklich keine Änderungen vorgenommen data (oder row), schreiben Sie einfach die Originale wieder in die Datei, deshalb sieht es so aus, als ob sich nichts geändert hat col was kommt von col = row.split()Das würde sich nicht ändern row und data auch.

Ohne zu viel auf Ihrem Code zu ändern, möchten Sie es wahrscheinlich auf diese Weise beheben, die einen anderen verwenden list zum Speichern der aktualisierten Zeilen:

textfile = "%sfile.txt" % (path)
with open(textfile,"r") as f:
# read a LIST of rows into "data"
data = f.readlines()
previous_col = ""
current_col = ""
lst = list()  # for the new content you are going to override
for row in data:
match_1 = "(*) Begin"
match_2 = "(*) End"
if (match_1 in row or match_2 in row):
col = row.split()
if (col[3] == "End"):
previous_col = col[1]
elif (col[3] == "Begin"):
current_col = col[1]

i = 0
if current_col:
if (col[3] == "Begin" and current_col == previous_col):
i += 1 # increment
col[3] = "Begin [%s]" % (i)
else:
col[3] = "Begin [0]"

lst.append(" ".join(col)) # you can adjust it to the behavior you need
else:  # append original line
lst.append(row)

# and write everything back
with open(textfile, "w") as f:
for line in lst:  # write the element in lst to the file
f.writelines(line)
f.writelines("n")