ubuntuusers.de

Bei zeilenweisem Lesen aus Datei zu viele Zeilenumbrüche

Status: Gelöst | Ubuntu-Version: Ubuntu GNOME 14.04 (Trusty Tahr)
Antworten |

Tronde Team-Icon

Avatar von Tronde

Anmeldungsdatum:
23. November 2006

Beiträge: 1640

Guten Morgen,

um meine Python-Kenntnisse aufzufrischen, habe ich ein kleines Skript geschrieben, welches ICMP-Requests an einen Host sendet und die Ausgabe statt auf STDOUT in eine Variable schreibt. In einem zweiten Schritt werden wieder ICMP-Requests versendet. Doch diesmal wird die Ausgabe in eine Datei geschrieben.

 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
#!/usr/bin/python
# -*- coding: utf-8 -*-

import argparse, subprocess

def icmp(host):
     """ Diese Prozedur sendet einige ICMP-Pakete an einen Host. """
     ping_result = subprocess.check_output(["ping", "-c 4", host])
     return ping_result

parser = argparse.ArgumentParser(description=" test.py")
parser.add_argument("-H", "--Host", dest="Host", required=False)

args = parser.parse_args()

host = args.Host

print "Ausgabe der ICMP-Requests:"
print(icmp(host))

f = open('workfile', 'a')
f.write(icmp(host))
f.close()
f = open('workfile', 'r')
#output = f.readlines()
print "Ausgabe der Datei:"
for line in f.readlines():
    print(line)
f.close()

Gebe ich Variable und Dateiinhalt aus, fällt mir auf, dass bei der Dateiausgabe nach jeder Zeile zwei Zeilenumbrüche ausgegeben werden. Ich möchte jedoch nur einen Zeilenumbruch nach dem ausgegebenen Text haben.

Könnt ihr mir einen Tipp geben, wie man das macht?

MfG
Tronde

elostio

Avatar von elostio

Anmeldungsdatum:
2. Februar 2006

Beiträge: 424

Wohnort: Guayaquil

Mit

1
2
3
4
5
6
import sys
...
for line in f.readlines():
    sys.stdout.write(line)
sys.stdout.flush()
f.close()

sollte es funktionieren. In python3 hast du auch die Möglichkeit print("bla", end="") zu verwenden.

lg

Tronde Team-Icon

(Themenstarter)
Avatar von Tronde

Anmeldungsdatum:
23. November 2006

Beiträge: 1640

Guten Abend,

danke für deinen Tipp. Damit verhält sich die Ausgabe so wie erwartet.

Kannst du mir noch erklären was die Zeile

1
sys.stdout.flush()

bewirkt?

Ich sehe keine Änderung in der Ausgabe, wenn ich diese Zeile auskommentiere.

MfG
Tronde

elostio

Avatar von elostio

Anmeldungsdatum:
2. Februar 2006

Beiträge: 424

Wohnort: Guayaquil

Hier findest du die Antwort: http://stackoverflow.com/questions/10019456/usage-of-sys-stdout-flush-method .

Probier auch das erwähnte Beispiel aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/python
     
import time
import sys
     
for i in range(5):
    print i, 

#sys.stdout.flush()                                                                      
 
   time.sleep(1)

Hier sieht du den Unterschied.

Antworten |