Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[python3] print tot een bepaalde karakter in textfile

Pagina: 1
Acties:

  • zoek34
  • Registratie: Mei 2011
  • Laatst online: 12-10 10:01
Mede-auteur:
  • jacco5555
  • Registratie: Januari 2009
  • Laatst online: 19-11 18:25

jacco5555

Hallo Tweakers.

Op dit moment ben ik bezig om met behulp van Python een bestand uit te lezen. Hierbij heb ik lang niet alle regels van dat bestand nodig. Daarom gebruik ik het pythonscript om maar de regels uit te printen (een latere stap is een verder verwerking van de gegevens, echter is dat niet het huidige probleem).

Het volgende bestand wordt uitgelezen
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
%!AGURI-1.0
%%StartTime: Thu Jun 05 12:50:18 2014 (2014/06/05 12:50:18)
%%EndTime:   Thu Jun 05 12:51:18 2014 (2014/06/05 12:51:18)
%AvgRate: 1.77Mbps

[src address] 13270709 (100.00%)
                192.168.56.1    2762881 (20.82%)
                192.168.56.102  10504084 (79.15%)
::/0    3744 (0.03%/0.03%)
%LRU hits: 100.00% (77922/77925)  reclaimed: 0
[dst address] 13270709 (100.00%)
0.0.0.0/0       2001 (0.02%/99.97%)
                192.168.56.1    10504084 (79.15%)
                192.168.56.102  2760880 (20.80%)
::/0    3744 (0.03%/0.03%)
%LRU hits: 99.99% (77920/77925)  reclaimed: 0
[ip:proto:srcport] 13270709 (100.00%)
0/0:0:0 5745 (0.04%/100.00%)
4:6:0/0 159094 (1.20%/99.96%)
                4:6:80  10503950 (79.15%)
    4:6:57344/4 655360 (4.94%/9.88%)
      4:6:57344/6       327680 (2.47%/2.47%)
      4:6:60416/6       327680 (2.47%/2.47%)
     4:6:61440/5        655540 (4.94%/4.94%)
     4:6:63488/5        326600 (2.46%/4.79%)
      4:6:64512/6       155140 (1.17%/2.33%)
       4:6:65024/7      153920 (1.16%/1.16%)
%LRU hits: 78.04% (60809/77925)  reclaimed: 33722
[ip:proto:dstport] 13270709 (100.00%)
0/0:0:0 102965 (0.78%/100.00%)
                4:6:80  2760820 (20.80%)
         4:6:49152/9    142788 (1.08%/1.08%)
         4:6:49280/9    151218 (1.14%/1.14%)
         4:6:49408/9    148666 (1.12%/1.12%)
      4:6:57344/6       618920 (4.66%/9.37%)
        4:6:57344/8     311458 (2.35%/2.35%)
        4:6:58112/8     312538 (2.36%/2.36%)
       4:6:58368/7      621404 (4.68%/4.68%)
       4:6:58880/7      629126 (4.74%/4.74%)
      4:6:59392/6       310432 (2.34%/9.43%)
        4:6:59648/8     314428 (2.37%/2.37%)
       4:6:59904/7      626156 (4.72%/4.72%)
        4:6:60416/8     314644 (2.37%/2.37%)
        4:6:60672/8     312106 (2.35%/2.35%)
       4:6:60928/7      621674 (4.68%/4.68%)
      4:6:61440/6       312052 (2.35%/9.39%)
        4:6:61440/8     311350 (2.35%/2.35%)
       4:6:61952/7      622376 (4.69%/4.69%)
      4:6:62464/6       624590 (4.71%/9.39%)
       4:6:62464/7      621188 (4.68%/4.68%)
      4:6:63488/6       315292 (2.38%/9.42%)
       4:6:63488/7      626534 (4.72%/4.72%)
        4:6:64256/8     307948 (2.32%/2.32%)
      4:6:64512/6       307894 (2.32%/9.27%)
        4:6:64768/8     307948 (2.32%/2.32%)
         4:6:65024/9    154082 (1.16%/1.16%)
         4:6:65152/9    154028 (1.16%/1.16%)
         4:6:65280/9    153812 (1.16%/1.16%)
         4:6:65408/9    152272 (1.15%/1.15%)
%LRU hits: 82.06% (63945/77925)  reclaimed: 27452


Hierbij moet regel 11 t/m regel 15 uiteindelijk uitgeprint worden.

Op dit moment heb ik daarvoor het volgende script wat niet helemaal werkt:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/local/bin/python3

data=[]
flag=False
with open('datafile','r') as f:
        for line in f:
                if line.startswith('[dst address]'):
                        flag=True
                if flag:
                        data.append(line)
                if line.strip().endswith('%LRU'):
                        flag=False
print(data)


Als ik het script uitvoer dan werkt het begin printen van dst address perfect. Echter het printen tot %LRU werkt niet. Het script blijft het bestand uitprinten totdat het het eind van het bestand heeft bereikt. Daarnaast komt de uitvoer in raw data eruit. Liever zou ik iets vinden om de data op dezelfde manier eruit te krijgen als het in het bestand staat. Op dit moment ziet de uitvoer er namelijk zo uit:
[code]
['[dst address] 13270709 (100.00%)\n', '0.0.0.0/0 2001 (0.02%/99.97%)\n', ' 192.168.56.1 10504084 (79.15%)\n', ' 192.168.56.102 2760880 (20.80%)\n', '::/0 3744 (0.03%/0.03%)\n', '%LRU hits: 99.99% (77920/77925) reclaimed: 0\n', '[ip:proto:srcport] 13270709 (100.00%)\n', '0/0:0:0 5745 (0.04%/100.00%)\n', '4:6:0/0 159094 (1.20%/99.96%)\n', ' 4:6:80 10503950 (79.15%)\n', ' 4:6:57344/4 655360 (4.94%/9.88%)\n', ' 4:6:57344/6 327680 (2.47%/2.47%)\n', ' 4:6:60416/6 327680 (2.47%/2.47%)\n', ' 4:6:61440/5 655540 (4.94%/4.94%)\n', ' 4:6:63488/5 326600 (2.46%/4.79%)\n', ' 4:6:64512/6 155140 (1.17%/2.33%)\n', ' 4:6:65024/7 153920 (1.16%/1.16%)\n', '%LRU hits: 78.04% (60809/77925) reclaimed: 33722\n', '[ip:proto:dstport] 13270709 (100.00%)\n', '0/0:0:0 102965 (0.78%/100.00%)\n', ' 4:6:80 2760820 (20.80%)\n', ' 4:6:49152/9 142788 (1.08%/1.08%)\n', ' 4:6:49280/9 151218 (1.14%/1.14%)\n', ' 4:6:49408/9 148666 (1.12%/1.12%)\n', ' 4:6:57344/6 618920 (4.66%/9.37%)\n', ' 4:6:57344/8 311458 (2.35%/2.35%)\n', ' 4:6:58112/8 312538 (2.36%/2.36%)\n', ' 4:6:58368/7 621404 (4.68%/4.68%)\n', ' 4:6:58880/7 629126 (4.74%/4.74%)\n', ' 4:6:59392/6 310432 (2.34%/9.43%)\n', ' 4:6:59648/8 314428 (2.37%/2.37%)\n', ' 4:6:59904/7 626156 (4.72%/4.72%)\n', ' 4:6:60416/8 314644 (2.37%/2.37%)\n', ' 4:6:60672/8 312106 (2.35%/2.35%)\n', ' 4:6:60928/7 621674 (4.68%/4.68%)\n', ' 4:6:61440/6 312052 (2.35%/9.39%)\n', ' 4:6:61440/8 311350 (2.35%/2.35%)\n', ' 4:6:61952/7 622376 (4.69%/4.69%)\n', ' 4:6:62464/6 624590 (4.71%/9.39%)\n', ' 4:6:62464/7 621188 (4.68%/4.68%)\n', ' 4:6:63488/6 315292 (2.38%/9.42%)\n', ' 4:6:63488/7 626534 (4.72%/4.72%)\n', ' 4:6:64256/8 307948 (2.32%/2.32%)\n', ' 4:6:64512/6 307894 (2.32%/9.27%)\n', ' 4:6:64768/8 307948 (2.32%/2.32%)\n', ' 4:6:65024/9 154082 (1.16%/1.16%)\n', ' 4:6:65152/9 154028 (1.16%/1.16%)\n', ' 4:6:65280/9 153812 (1.16%/1.16%)\n', ' 4:6:65408/9 152272 (1.15%/1.15%)\n', '%LRU hits: 82.06% (63945/77925) reclaimed: 27452\n', '\n']


Weet iemand een oplossing voor dat het printen niet stopt bij de %LRU en een oplossing voor het printen van de raw data.

Met vriendelijke groeten,

Zoek34 en Jacco5555

  • LinuX-TUX
  • Registratie: December 2003
  • Laatst online: 20-11 14:02
Met een debugger had je dit al uit kunnen vogelen. De regel eindigt namelijk niet met "%LRU", de regel begint ermee. Daarbij ben ik niet bekend met Python, maar in bepaalde talen zijn '%' tekentjes de moeite waard om te escapen. (denk overigens niet dat Python er last van heeft, maar dat is voor jou om te proberen/ondervinden)

In de toekomst misschien handig om te overwegen / om in te verdiepen:
• Debugger / fatsoenlijke IDE / system print statements op de juiste plaatsen om te kijken waar je op aan het matchen bent. IDE om de api's bij de hand te hebben & debugger voor realtime analyse.
• Regular Expressions ... 1 keer leren, de rest van je leven heb je er plezier van.

  • zoek34
  • Registratie: Mei 2011
  • Laatst online: 12-10 10:01
Heb uiteindelijk de goede oplossing ervoor gevonden:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/local/bin/python3

#imports
import re
import sys

#Function
#Number=input("Type a number between 0 and 100 without decimals: ")
data=[]
flag=False
with open('datafile', 'r') as f:
        for line in f:
                if line.startswith('[dst address]'):
                        flag=True
                if line.startswith('%LRU'):
                        flag=False
                if flag:
                        data.append(line)

a=2
b=len(data)

print("The following data was found: ")
for a in list(range(a, b-1, 1)):
        print(re.findall("\(([^\)]+%)\)", data[a]), " of all data originates from network/IP ",
re.findall("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}", data[a]))


Nu ben ik alleen nog opzoek naar een manier op de output van de regex naar het percentage in een grote lijst te plaatsen. Ik kan het wel vinden als ik het probeer om van meerdere vooraf gedefineerde lijsten, er een grote lijst van te maken, maar niet in combinatie met regex. (Google komt na meerdere dagen zoeken niet op het gewenste zoekresultaat)

Uiteindelijk zou de output van de list dan zoiets moeten worden
print(list)
['getal1', 'getal2', 'getal3', 'etc']

Hierbij komt de waarde van de getallen uit de regex re.findall("\(([^\)]+%)\)", data[a]).