Suche nach bestimmten Buchstaben in einer Textdatei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
YasinSidirva
User
Beiträge: 3
Registriert: Donnerstag 11. Mai 2017, 13:32

Hallo alle Zusammen,
ich habe ein Projekt in dem ich aus einer DXF Datei den G-Code erstellen muss. Aus der resultierenden Textdatei muss ich Zeilen filtern in denen die Buchstaben G, M und F vorkommen. Bis jetzt habe ich es geschafft die Textdatei zu erstellen. Ich habe jedoch große Probleme die Textdatei nur mit den Zeilen in denen ein G, M und F vorkommt in Python zu öffnen. Also es soll die komplette Zeile in Python exportiert werden sobald ein G, M und F darin vorkommen.
Ich wäre euch sehr dankbar wenn ihr mir behilflich sein könntet.
beertonic
User
Beiträge: 37
Registriert: Montag 8. Mai 2017, 15:26

Du kannst die Textdatei Zeilenweise einlesen und mit Regex prüfen ob die Buchstaben vorkommen.
https://docs.python.org/3/howto/regex.html
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was extrem hilfreich wäre:

1. Zeig mal den Python-Code, den du hast, um die .txt Datei zu öffnen und die Zeilen nach den Buchstaben zu durchsuchen.
2. Zeig mal ein paar Beispielzeilen aus der .txt-Datei. So 10-15 "typische" Zeilen sollten reichen.

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Du kannst die Textdatei Zeilenweise einlesen und mit Regex prüfen ob die Buchstaben vorkommen.
Das sollte auch der `in`-Operator reichen.

Gruß, noisefloor
YasinSidirva
User
Beiträge: 3
Registriert: Donnerstag 11. Mai 2017, 13:32

noisefloor hat geschrieben:Hallo,

was extrem hilfreich wäre:

1. Zeig mal den Python-Code, den du hast, um die .txt Datei zu öffnen und die Zeilen nach den Buchstaben zu durchsuchen.
2. Zeig mal ein paar Beispielzeilen aus der .txt-Datei. So 10-15 "typische" Zeilen sollten reichen.

Gruß, noisefloor
Hallo noisefloor

1. Es gibt nur den Code mit dem die Textdatei in Python geöffnet wird einfach mit Open. Der Code fängt mit dem öffnen und filtern der Textdatei an.
2.

G0 Z 15.000

(*** LAYER: 0 ***)
T1 M6
S6000

(* SHAPE Nr: 0 *)
G0 X -14.980 Y -19.550
M3 M8
G0 Z 3.000
F150
G1 Z -1.500
F400
G1 X -14.980 Y 49.024
G1 X 55.773 Y 29.795
G1 X 55.773 Y -38.779
G1 X -14.980 Y -19.550
F150
G1 Z -3.000
F400
G1 X -14.980 Y 49.024
G1 X 55.773 Y 29.795
G1 X 55.773 Y -38.779
G1 X -14.980 Y -19.550
F150
G1 Z 3.000
G0 Z 15.000
M9 M5

F150
G1 Z 3.000
G0 Z 15.000
M9 M5
G0 X 0.000 Y 0.000
M2 (Program end)

--> Das ganze soll nach den Buchstaben G, M und F gefiltert werden und Zeilen in denen diese Buchstaben vorkommen sollen als ein Array in Python ausgewiesen werden.
beertonic
User
Beiträge: 37
Registriert: Montag 8. Mai 2017, 15:26

@noisefloor: Ja das stimmt. Solange man zusammenhängende Zeichenketten sucht reicht 'in' völlig aus.

Entweder du liest die Zeilen einzeln ein, zählst mit und durchsuchst sie mit 'in' (z.B.: if 'c' in string), oder du liest den ganzen Text ein und durchsuchst ihn mit Regex.
BlackJack

@YasinSidirva: Ob eine Teilzeichenkette in einer anderen vorkommt, kann man mit dem ``in``-Operator prüfen:

Code: Alles auswählen

In [1]: 'x' in 'Python'
Out[1]: False

In [2]: 'y' in 'Python'
Out[2]: True
Mit Hilfe einer Schleife oder eines Generatorausdrucks und der `any()`-Funktion lässt sich nun sehr leicht eine Funktion schreiben die eine Zeile testet.
YasinSidirva
User
Beiträge: 3
Registriert: Donnerstag 11. Mai 2017, 13:32

beertonic hat geschrieben:@noisefloor: Ja das stimmt. Solange man zusammenhängende Zeichenketten sucht reicht 'in' völlig aus.

Entweder du liest die Zeilen einzeln ein, zählst mit und durchsuchst sie mit 'in' (z.B.: if 'c' in string), oder du liest den ganzen Text ein und durchsuchst ihn mit Regex.
Könntest du Bitte einen Beispielcode zeigen wie das ganze aussehen könnte wenn ich nach den Buchstaben G0 und G1 filtere. Ich kenn mich mit Regex und 'in' nicht aus. Ich bin ein Anfänger in Python.

Viele Grüße

Yasin
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@YasinSidirva: Was soll daran schwierig sein?

Code: Alles auswählen

with open('a.txt','r') as f:
    for l in f:
        if 'G' in l or 'M' in l or 'F' in l:
            print(l)
Achtung die eingelesenen Zeilen haben am Ende noch ein Newline Zeichen '\n', eventuell mit Ausnahme der letzten. Ist die Datei mit Windows erstellt, dann hat sie evtl. noch ein Carriage Return '\r', denn In Windows enden die Zeilen mit '\r\n'.
beertonic
User
Beiträge: 37
Registriert: Montag 8. Mai 2017, 15:26

Code: Alles auswählen

zeichenkette = 'bier'
for buchstabe in zeichenkette:
	print(buchstabe)
ausgabe:

Code: Alles auswählen

b
i
e
r
Zu Regex kannst du dir die Links mal angucken, aber ich würde an deiner Stelle lieber erst die Python Grundlagen lernen.
https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck
https://docs.python.org/2/library/re.html
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn es sicher / bekannt ist, dass der gesuchte Buchstabe immer an Zeilenanfang steht, dann geht das auch mit der `startswith()` Methode von Strings:

[codebox=pycon file=Unbenannt.txt]>>> what_to_look_for = ('G', 'M', 'F')
>>> with open('input.txt', 'r') as f:
... for line in f:
... if line.startswith(what_to_look_for):
... print(line)
...
G0 Z 15.000

G0 X -14.980 Y -19.550

M3 M8

G0 Z 3.000

F150
[/code]

Gruß, noisefloor
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

beertonic hat geschrieben:Zu Regex kannst du dir die Links mal angucken, aber ich würde an deiner Stelle lieber erst die Python Grundlagen lernen.
Regex zu benützen ist wohl hier nicht angebracht. Regex nimmt man zum Parsen komplizierter Zeichenfolgen her. Dem User zu raten, sich zuerst mit Regex zu beschäftigen, trägt nicht zur Problemlösung bei.

Das wird wohl mit Regex weder einfacher noch schneller:
if 'G' in l or 'M' in l or 'F' in l:

Wenn Du anderer Meinung bist, dann zeige es doch. Formuliere das doch mal mit Regex. Und wenn Du meinst, wenn es zwar nicht einfacher wäre, dafür aber schneler, dann miss das bitte nach.

Zuerst alle Python Grundlagen zu studieren ist ach nicht der richtige Rat.

Man sollte kennen: open
Man sollte gehört haben: with open

Und wenn man googled mit "python with open, stößt man darauf: http://stackoverflow.com/questions/1155 ... -in-python
Damit kann man die einzelnen Zeilen bekommen. Es ginge natürlich auch mit open, readline. und close.

Und wissen sollte man auch um: in
Wenn man allerding in nicht kennt, dann sich zuerst mt Python Grundlagen befassen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

noisefloor hat geschrieben:Hallo,wenn es sicher / bekannt ist, dass der gesuchte Buchstabe immer an Zeilenanfang steht, dann geht das auch mit der `startswith()` Methode von Strings
Ja gehen tut Vieles. Aber startswith muss man erst kennen. Dann ist es eine Stringfunktion und mann muss wissen, dass man auch ein Tuple übergeben kann. Das ist beschrieben hier: https://docs.python.org/2/library/stdty ... startswith

Wenn es aber nur um einen Buchstaben geht, bedarf es weder einer Stringfunktion, noch einer Funktion, die dem User ziemlich unbekannt sein dürfte.

Simpel und schnell wäre da:

if line[0] in 'GMF':

Und das sind Grundlagen, die man kennen sollte, anstatt nach etwas Komplizierterem Ausschau zu halten.

Ach so, Python Grundlagen braucht man auch fast gar keine, um Programme zu schreiben. Wer in nicht kennt, kann es ja auch so machen:

statt:

if line[0] in 'GMF':

geht auch:

if is_in(line[0],'GMF'):

Wenn man dazu definiert hat:

Code: Alles auswählen

def is_in(element,kind_of_list):
    length = len(kind_of_list)
    index = 0
    while index < length:
        if kind_of_list[index]==element:
            return True
        index += 1
    return False
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Python Grundlagen braucht man auch fast gar keine, um Programme zu schreiben.
Hervorragende Einstellung. Nicht. Erklärt aber andererseits den Qualität des Codes, den du hier im Forum hier so postest.

Gruß, noisefloor
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

noisefloor hat geschrieben:Hallo,
Python Grundlagen braucht man auch fast gar keine, um Programme zu schreiben.
Hervorragende Einstellung. Nicht. Erklärt aber andererseits den Qualität des Codes, den du hier im Forum hier so postest.
Gruß, noisefloor
Was willst Du damit sagen. Das ist Code Qualität:

if line[0] in 'GMF':

Eine is_in Funktion anstelle von in sollte man nicht schreiben, sondern grundlegende Python Funktionalität kennen und benützen.

Allerdings Qualität hätte so eine is_in Funktion schon. Man würde sie etwa in C benützen, wo es in nicht gibt. In Python allerdings unnötig und laufzeitverlangsamend. Man sollte das folglich nicht tun. Aber wer programmieren kann, aber bisher noch nicht in Python, könnte Programmierprobleme auch auf in Python unnötige Weise lösen.

Wenn jemand also nach einer Problemlösung fragt, die auch ohne besondere Python Kenntnisse machbar ist, dann hapert es wohl an allgemeinen Programmierkenntnissen.

Ach so, genausowenig finde ich line.startswith gut, wenn es nur um einen Buchstaben geht. Für mich wäre das vergleichbar mit so einer is_in Fuinktion.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Alfons Mittelmeyer hat geschrieben:Aber wer programmieren kann, aber bisher noch nicht in Python, könnte Programmierprobleme auch auf in Python unnötige Weise lösen.
Und Du zeigst dann, wie dies geht ...

'is_in' lässt sich übrigens besser schreiben als

Code: Alles auswählen

def is_in(value, iterable):
    for item in iterable:
        if value == item:
            return True
    return False
Was aber nicht erforderlich ist, denn es gibt ja 'in'.

Deine umständliche Variante ist allerdings besser geeignet, um Python-Anfänger auf die falsche Fährte zu locken.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

kbr hat geschrieben:
Alfons Mittelmeyer hat geschrieben: 'is_in' lässt sich übrigens besser schreiben als

Code: Alles auswählen

def is_in(value, iterable):
    for item in iterable:
        if value == item:
            return True
    return False
Was aber nicht erforderlich ist, denn es gibt ja 'in'.
Die von mir vorgestellte Funktion würde evtl. jemand schreiben der in nicht kennt. Aber Deine Variante macht da keinen Sinn, denn Du benützt in Zeile 2 in
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Wahrscheinlich hast Du auch noch Vorschläge, wie sich if, return und def vermeiden lassen ...
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

kbr hat geschrieben:Wahrscheinlich hast Du auch noch Vorschläge, wie sich if, return und def vermeiden lassen ...
Nö, Bedingungen wie if, else, Funktionen def und return sowie Schleifen while, break, continue gehören zu jeder Programmiersprache. Vermeidbar wäre aber for.

Man könnte höchstens einen Interpreter für eine andere Programmiersprache machen und diese Schlüsselworte umbenenen, vielleicht in wenn, sonst, solange_als, aufhören, weitermachen, definiere, zurückspringen oder abhauen.

Ich hatte mal in Python ein FORTH geschrieben, da konnte man auch if, else usw, beliebig umbenennen. Aber in Python Schlüsselworte umbenennen geht wohl nicht?

Zumindest wäre das nicht einfach: http://stackoverflow.com/questions/3647 ... r-keywords

Sinnvollerweise sollte man die Schlüsselworte nicht umbendennen sondern ein alias anlegen. Wie macht man das in Python?

Und sollte das alias von if, dann eine Kopie von if sein, oder auf das urprünliche if verweisen?
Zuletzt geändert von Alfons Mittelmeyer am Donnerstag 11. Mai 2017, 22:13, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Alfons Mittelmeyer hat geschrieben:
kbr hat geschrieben:Wahrscheinlich hast Du auch noch Vorschläge, wie sich if, return und def vermeiden lassen ...
Nö, Bedingungen wie if, else, Funktionen def und return sowie Schleifen while, break, continue gehören zu jeder Programmiersprache.
Nein, tun sie nicht. Lambda Calculus kommt ohne Bedingungen und Schleifen aus. Das spiegelt sich in der Praxis auch durchaus in funktionalen Programmiersprachen wieder. Assembler kommt ohne Funktionen und Schleifen aus, findet ebenfalls durchaus praktische Anwendung.
Antworten