ubuntuusers.de

Python - Wert aus String filtern

Status: Ungelöst | Ubuntu-Version: Kubuntu 11.04 (Natty Narwhal)
Antworten |

Nobuddy

Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo zusammen,

möchte aus einer Produktbeschreibung, die Inhaltsangabe herausfiltern.

Ich poste hier mal die Spalte mit ein paar Datensätzen

3M POST-IT INDEX MUSTERKARTE, INHALT: 25 STÜCK  ÜBERZEUGEN SIE IHRE KUNDEN !   
3M POST-IT RECYCLING NOTES MUSTERKARTE, INHALT: 25 STÜCK  ÜBERZEUGEN SIE IHRE KUNDEN !   
ORIGINAL TINTENPATRONEN+DRUCKKOPF OLIVETTI ANYWAY IN502, SCHWARZ ; INHALT: 20 ML (B0495) SIMPLE_WAY  
ORIGINAL TINTENPATRONEN+DRUCKKOPF OLIVETTI ANYWAY IN501, SCHWARZ ; INHALT 11 ML ANYWAY A4/ANYWAY A4 PHOTO/ANYWAY A4 BLUETOOTH/ANYWAY A4 SIMPLE/ANYWAY SIMPLE/ANYWAY BLUETOOTH/ANYWAY PHOTO/ANYWAY PHOTO WIRELESS/ANYWAY WIFI/ANYWAY A4 PHOTO WIRELESS/ANYWAY A4 WIFI/ANYWAY PHOTO PLUS/ANYWAY PHOTO WIRELESS PLUS/ANYWAY
HAMA BILDAUFHÄNGER MIT KLAPPÖSEN, 11 MM, FARBE: GOLD MIT DREIECKÖSEN UND JE ZWEI NÄGELN (8 MM), IDEAL ZUR BILDERRAHMENAUFHÄNGUNG BIS CA. 300 X 450 MM, BEFESTIGUNG MIT NAGEL INHALT: 10 STÜCK (7084)
HAMA BILDAUFHÄNGER MIT KLAPPÖSEN, 15 MM, FARBE: GOLD MIT DREIECKÖSEN UND JE ZWEI NÄGELN (8 MM), IDEAL ZUR BILDERRAHMENAUFHÄNGUNG BIS CA. 700 X 1000 MM, BEFESTIGUNG MIT NAGEL INHALT: 10 STÜCK (7085)
HERLITZ LÖSCHPAPIERBLOCK DIN A4, 80 G/QM, WEIß HOLZFREI INHALT: 10 BLATT (00382408-002)  
HERLITZ LÖSCHPAPIERBLOCK DIN A5, 80 G/QM, WEIß HOLZFREI INHALT: 10 BLATT (003282507-002)  
VIKTOR RICHTER KARTEIKARTEN A7, BLAU, LINIERT, INHALT: 100 (KK 7100 LINIERT)    
VIKTOR RICHTER KARTEIKARTEN A7, GRÜN, LINIERT, INHALT: 100 (KK 7100 LINIERT)    
PAPYRUS UNIVERSAL-PAPIER RAINBOW, A4, MITTELGELB 80 G/QM, BLANKO, HOLZFREI, PASTELL-FARBE, ALTERUNGSBESTÄNDIG, FSC ZERTIFIZIERT, IN TRANSPARENTER, WIEDERVERSCHLIEßBARER VERPACKUNG, FÜR INKJET-, LASERDRUCKER, KOPIERER, FAX INHALT: 2.500 BLATT (88042319)
PAPYRUS UNIVERSAL-PAPIER RAINBOW, A4, LACHS 80 G/QM, BLANKO, HOLZFREI, PASTELL-FARBE, ALTERUNGSBESTÄNDIG, FSC ZERTIFIZIERT, IN TRANSPARENTER, WIEDERVERSCHLIEßBARER VERPACKUNG, FÜR INKJET-, LASERDRUCKER, KOPIERER, FAX INHALT: 1.500 BLATT (88042497)

Ich habe dazu auch ein Konstrukt erstellt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
if wert27 == '':
	satz = wert4
	index = string.find(satz, 'INHALT:')   # Suchen nach 'INHALT' in String
	if index >= 0:
		start = index + 7              # Stringlänge nach 'INHALT:'
		a = wert4[start:]              # Neuer String nach 'INHALT:'
		index = string.find(a, '1' or '2' or '3' or '4' or '5' or '6' or '7' or '8' or '9') # Zahlen 1-9 finden
		if index == 0 or index == 1:
			start = start + index  # Neue Stringlänge, Anfang Zahl
			a = wert4[start:]      # Neuer String ab Zahl
			index = string.find(a, ' ')     # Gehe bis zum nächsten Leerzeichen
			end = start + index             # Länge des Zahlenstrings
			b = wert4[start:end]            # Ausgabe zahlenwert
			print(b)

'wert27' ist die Spalte, wo die Inhaltsangaben drin stehen sollen.

'wert4' ist die Spalte mit der Produktbeschreibung.

Zeile 7 funktioniert nicht so, nimmt immer den ersten Wert, hier '1'. Die anderen Werte werden ignoriert.

Ist das was ich hier gemacht habe, umständlich bzw. der falsche Ansatz?

Wenn ja, welche Vorschläge hättet Ihr dazu?

Wenn nein, gibt es etwas zu optimieren?

Das ist erst der Anfang, später muß ich noch 1000-Trennzeichen und Dezimaltrenner berücksichtigen, sowie die Inhaltsangabe wie Stück, Blatt usw. in eine gesonderte Spalte bringen.

Ich hoffe, Ihr könnt mich dabei unterstützen.

Grüße Nobuddy

Barabbas

Avatar von Barabbas

Anmeldungsdatum:
31. März 2007

Beiträge: 1651

Wohnort: Münster

Hallo,

ich finde dein Ansatz schon recht umständlich. Ich würde das erstmal mit regulären Ausdrücken versuchen:

>>> x="""3M POST-IT INDEX MUSTERKARTE, INHALT: 25 STÜCK  ÜBERZEUGEN SIE IHRE KUNDEN !   
... 3M POST-IT RECYCLING NOTES MUSTERKARTE, INHALT: 25 STÜCK  ÜBERZEUGEN SIE IHRE KUNDEN !   
... ORIGINAL TINTENPATRONEN+DRUCKKOPF OLIVETTI ANYWAY IN502, SCHWARZ ; INHALT: 20 ML (B0495) SIMPLE_WAY  
... ORIGINAL TINTENPATRONEN+DRUCKKOPF OLIVETTI ANYWAY IN501, SCHWARZ ; INHALT 11 ML ANYWAY A4/ANYWAY A4 PHOTO/ANYWAY A4 BLUETOOTH/ANYWAY A4 SIMPLE/ANYWAY SIMPLE/ANYWAY BLUETOOTH/ANYWAY PHOTO/ANYWAY PHOTO WIRELESS/ANYWAY WIFI/ANYWAY A4 PHOTO WIRELESS/ANYWAY A4 WIFI/ANYWAY PHOTO PLUS/ANYWAY PHOTO WIRELESS PLUS/ANYWAY
... HAMA BILDAUFHÄNGER MIT KLAPPÖSEN, 11 MM, FARBE: GOLD MIT DREIECKÖSEN UND JE ZWEI NÄGELN (8 MM), IDEAL ZUR BILDERRAHMENAUFHÄNGUNG BIS CA. 300 X 450 MM, BEFESTIGUNG MIT NAGEL INHALT: 10 STÜCK (7084)
... HAMA BILDAUFHÄNGER MIT KLAPPÖSEN, 15 MM, FARBE: GOLD MIT DREIECKÖSEN UND JE ZWEI NÄGELN (8 MM), IDEAL ZUR BILDERRAHMENAUFHÄNGUNG BIS CA. 700 X 1000 MM, BEFESTIGUNG MIT NAGEL INHALT: 10 STÜCK (7085)
... HERLITZ LÖSCHPAPIERBLOCK DIN A4, 80 G/QM, WEIß HOLZFREI INHALT: 10 BLATT (00382408-002)  
... HERLITZ LÖSCHPAPIERBLOCK DIN A5, 80 G/QM, WEIß HOLZFREI INHALT: 10 BLATT (003282507-002)  
... VIKTOR RICHTER KARTEIKARTEN A7, BLAU, LINIERT, INHALT: 100 (KK 7100 LINIERT)    
... VIKTOR RICHTER KARTEIKARTEN A7, GRÜN, LINIERT, INHALT: 100 (KK 7100 LINIERT)    
... PAPYRUS UNIVERSAL-PAPIER RAINBOW, A4, MITTELGELB 80 G/QM, BLANKO, HOLZFREI, PASTELL-FARBE, ALTERUNGSBESTÄNDIG, FSC ZERTIFIZIERT, IN TRANSPARENTER, WIEDERVERSCHLIEßBARER VERPACKUNG, FÜR INKJET-, LASERDRUCKER, KOPIERER, FAX INHALT: 2.500 BLATT (88042319)
... PAPYRUS UNIVERSAL-PAPIER RAINBOW, A4, LACHS 80 G/QM, BLANKO, HOLZFREI, PASTELL-FARBE, ALTERUNGSBESTÄNDIG, FSC ZERTIFIZIERT, IN TRANSPARENTER, WIEDERVERSCHLIEßBARER VERPACKUNG, FÜR INKJET-, LASERDRUCKER, KOPIERER, FAX INHALT: 1.500 BLATT (88042497)"""

>>> rg = re.compile(r"INHALT:? ([0-9.]*) (Blatt|Stück|ML)?", re.I)
>>> rg.findall(x)

Ergebnis wäre in diesem Fall:

[('25', 'STÜCK'), ('25', 'STÜCK'), ('20', 'ML'), ('11', 'ML'), ('10', 'STÜCK'), ('10', 'STÜCK'), ('10', 'BLATT'), ('10', 'BLATT'), ('100', ''), ('100', ''), ('2.500', 'BLATT'), ('1.500', 'BLATT')]

Man muss in diesem Beispiel aber spezifizieren, welche Einheiten es überhaupt gibt (Blatt, ML, etc). Es wäre weitaus besser, wenn das Ausgabeformat bereits CSV oder so wäre.

Ich möchte auch dezent darauf hinweisen, dass ich von regulären Ausdrücken keine große Ahnung habe, vll. kann man da noch was optimieren.

lG

brb

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo Barabbas,

interessanter Ansatz! 👍

Das mit dem csv-Format lässt sich machen.

Bei den Einheiten wird es etwas komplizierter. Stück und Blatt gehören dazu. Es gibt aber auch Mengenangaben ohne Einheiten und bestimmte Einheiten, wie ML sollen nicht verwendet werden.

Grüße Nobuddy

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Hallo,

erste Voraussetzung für das erfolgreiche Parsen solcher Dinge ist es, eine exakte Spezifikation zu erhalten. Es wäre schon mal toll zu wissen, wie eine Zeile aufgebaut sien kann? Gibt es eine feste Anzahl an Spalten? Wie sind diese getrennt?

Danach kann man sich an die "Mikro"-Formate einzelner Spalten machen und gucken, wie man die angehen kann.

Also: Versuche mal so eaxkt wie möglich aufzuschreiben, welche Möglichkeiten es wo geben kann.

Generell ist hier ein Ansatz mit RegExps vermutlich am sinnvollsten.

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Lysander schrieb:

Hallo,

erste Voraussetzung für das erfolgreiche Parsen solcher Dinge ist es, eine exakte Spezifikation zu erhalten. Es wäre schon mal toll zu wissen, wie eine Zeile aufgebaut sien kann? Gibt es eine feste Anzahl an Spalten? Wie sind diese getrennt?

Dachte, ich poste erstmal die wesentliche Dinge.

Eine Zeile ist in 26 Spalten aufgeteilt, die durch TAB '\t' getrennt sind.

Danach kann man sich an die "Mikro"-Formate einzelner Spalten machen und gucken, wie man die angehen kann.

Ok, die Spalte um die es geht, habe ich ja schon einen Auszug gepostet.

Also: Versuche mal so eaxkt wie möglich aufzuschreiben, welche Möglichkeiten es wo geben kann.

Inhaltsangaben beginnen mit 'INHALT:' innerhalb des Strings, der oben geposteten Spalte (Auszug).

Beispiele von Inhaltsangaben:

INHALT: 10 BLATT
INHALT: 100
INHALT: 1 X 50 ML      < Nein
INHALT: 5 STÜCK
INHALT: 1.650
INHALT: 190 G
INHALT: 8 X GOLD       < Nein
INHALT: 18 X WEIß      < Nein
INHALT: 1.000 G
INHALT: 10 + 2 GRATIS

Generell ist hier ein Ansatz mit RegExps vermutlich am sinnvollsten.

Wichtig wäre zuerst mal die einfachen Inhaltsangaben, wie

INHALT: 10 BLATT
INHALT: 100
INHALT: 5 STÜCK
INHALT: 1.650

sauber gefiltert zu bekommen.

Bei den anderen Inhaltsangaben, wird es haariger werden ...

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Nobuddy schrieb:

Bei den anderen Inhaltsangaben, wird es haariger werden ...

Was soll denn mit den Spalten passieren, wo Du "Nein" angemarkert hast? Und welche "anderen" Angaben gibt es ggf. noch? Ich würde doch jetzt so viel wie möglich wissen wollen, damit man keinen optimierten RegExp bastelt, den man später wegwerfen kann. Sollte da noch Kontext wichtig sein, muss man das Problem eh noch mal gesondert angehen.

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Lysander schrieb:

Nobuddy schrieb:

Bei den anderen Inhaltsangaben, wird es haariger werden ...

Was soll denn mit den Spalten passieren, wo Du "Nein" angemarkert hast? Und welche "anderen" Angaben gibt es ggf. noch? Ich würde doch jetzt so viel wie möglich wissen wollen, damit man keinen optimierten RegExp bastelt, den man später wegwerfen kann. Sollte da noch Kontext wichtig sein, muss man das Problem eh noch mal gesondert angehen.

Die mit 'Nein' sollen nicht als Inhaltsangabe verwendet werden.

Also alles was dem entspricht 'ZAHL X IRGENDWAS ODER AUCH NICHTS', soll nicht berücksichtigt werden.

Mir wäre es wichtig und ich wäre schon zufrieden, wenn ich diese Inhaltsangaben (Beispiele)

INHALT: 10 BLATT
INHALT: 100
INHALT: 5 STÜCK
INHALT: 1.650

sauber verarbeiten könnte.

Ich glaube auch, daß bei allem anderen, das Gefrickel und die Vielzahl an Variationen, eine saubere Lösung erheblich erschwert und das muß wirklich nicht sein.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Das sollte dann so gehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
In [31]: regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)

In [33]: re.search(regexp, data[2]).groupdict()
Out[33]: {'UNIT': u'ST\xdcCK', 'VALUE': u'5'}

In [34]: data
Out[34]: [u'INHALT: 10 BLATT', u'INHALT: 100', u'INHALT: 5 ST\xdcCK', u'INHALT: 1.650']

In [35]: for item in data:
   ....:     re.search(regexp, item).groupdict()
   ....:     
   ....:     
Out[35]: {'UNIT': u'BLATT', 'VALUE': u'10'}
Out[35]: {'UNIT': u'', 'VALUE': u'100'}
Out[35]: {'UNIT': u'ST\xdcCK', 'VALUE': u'5'}
Out[35]: {'UNIT': u'', 'VALUE': u'1.650'}

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo Lysander,

Du schüttelst das gerade so aus Deinem Ärmel ..., wow!

Da brauche ich ein wenig, um das auch zu verstehen.

'VALUE' ist die Variable für die Spalte Produktbeschreibung, ja?

Was ist 'UNIT'?

Könntest Du mir evtl. die erste Zeile für mein Verständnis erklären?

Grüße Nobuddy

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Das ist alles gar nicht so schwierig. RegExps lassen sich leider besser schreiben als später lesen 😉

1
2
3
4
5
6
r"""
INHALT: ? # Fester String, gefolgt von einem oder keinem Leerzeichen (`?`)
(\d*\.?\d*) # Gruppe von beliebig vielen (`*`) Digits `\d` gefolgt von einem / keinem Punkt `.` (escapen, da "." sonst für ein beliebiges Zeichen steht) und von wieder beliebig vielen Digits.
\s* # beliebig viele Whitespaces
(\w*) # Gruppe von beliebig vielen Alphanumerischen Zeichen
"""

Die ?P<name> definieren mir nur Namen für gefundene Gruppen (...). Damit kann ich mir ein Dictionary pro gefundenem RegExp in einem String aufbauen lassen. Praktisch für den Zugriff, da Du sonst ein Tupel bekommst und dort über den Index gehen musst (wirkt oftmals kryptisch).

Mehr steckt da nicht dahinter.

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Lysander, danke für die Erklärung, jetzt kann ich das besser nachvollziehen.

Jedoch ist mir noch unklar, wie ich das einbinden kann.

Hier mal das Python-Script mit Deinem Konstrukt.

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

### Import Module
from datetime import date
now = date.today()
heute = now.strftime('%Y.%m.%d-')

import re
import os
import string
import csv



### Basis-Infos
# Quellliste für Lieferanten-Produktdaten
quellliste_subdir = 'daten'	# Ordner für Datei
quellliste_filename = '{}liste.txt'.format(heute)	# Namen der Datei
quellliste_path = os.path.join(os.path.dirname(__file__),  quellliste_subdir, quellliste_filename)	# Pfad zur Datei inklusive Dateinamen


### Programm
# Quelldatei Lieferanten-Produktdaten öffnen
# Kontrolle, ob Quelldatei vorhanden
with open(quellliste_path, "r") as in_file:
	reader = csv.reader(in_file, delimiter="\t")

	# Zeilenweise aus CSV-Liste auslesen
	for row in reader:
		beschreibung = row[3]

		# Suche in Spalte beschreibung, nach String 'INHALT:'
		# und gebe die Inhaltsangabe aus
		regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
		re.search(regexp, data[2]).groupdict()
		data
		for item in data:
			re.search(regexp, item).groupdict()

Hoffe, daß dies so richtig umgesetzt ist.

Bei diesem Konstrukt, erhalte ich folgende Fehlermeldung:

Traceback (most recent call last):
  File "__inhalt__.py", line 36, in <module>
    re.search(regexp, data[2].groupdict()
NameError: name 'data' ist not defined

Bestimmt ein Gedankenfehler von mir ...

busfahrer

Avatar von busfahrer

Anmeldungsdatum:
9. April 2007

Beiträge: 3052

Hallo

wie die Fehlermeldung schon sagt, der Name data ist nicht definiert. Habe auch nicht die große Ahnung, vermute aber das du die Variable data durch die Variable inhalt ersetzen musst. Blicke aber auch nicht so ganz durch 😳

Gruß....busfahrer

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Hallo Busfahrer,

das habe ich auch schon versucht

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
with open(quellliste_path, "r") as in_file:
	reader = csv.reader(in_file, delimiter="\t")

	# Zeilenweise aus CSV-Liste auslesen
	for row in reader:
		beschreibung = row[3]
		data = beschreibung

		# Suche in Spalte beschreibung, nach String 'INHALT:'
		# und gebe die Inhaltsangabe aus
		regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
		re.search(regexp, data[2]).groupdict()
		data
		for item in data:
			re.search(regexp, item).groupdict()

Siehe zeile 7.

Die Fehlermeldung hier

Traceback (most recent call last):
  File "__inhalt__.py", line 37, in <module>
    re.search(regexp, data[2].groupdict()
IndexError: string index out of range

Danach habe ich dies versucht

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
with open(quellliste_path, "r") as in_file:
	reader = csv.reader(in_file, delimiter="\t")

	# Zeilenweise aus CSV-Liste auslesen
	for row in reader:
		beschreibung = row[3]
		data = beschreibung

	# Suche in Spalte beschreibung, nach String 'INHALT:'
	# und gebe die Inhaltsangabe aus
	regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)
	re.search(regexp, data[2]).groupdict()
	data
	for item in data:
		re.search(regexp, item).groupdict()

Hier dann die Fehlermeldung

Traceback (most recent call last):
  File "__inhalt__.py", line 37, in <module>
    re.search(regexp, data[2].groupdict()
AttributeError: 'NoneType' object has no attribute 'groupdict'

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Oh weia... Du versuchst zu viel, ohne die Grundlagen gründlich durchgearbeitet zu haben.

1
2
3
4
5
6
# Am besten Außerhalb der Funktion, ruhig global
# dann besserer Name; 
PRODUCT_VALUE = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)

beschreibung = row[3]
result = re.search(regexp, beschreibung).groupdict()

Du musst doch mal in der Doku nachlesen, wie die Signatur der Methode search aussieht. Als erster Parameter muss dort ein RegExp stehen (den wir zur Effizienz oben bereits kompilieren, muss man nur einmal machen!) und als zweiter der String, der durchsucht werden soll. Bei Dir ist der String an den Namen beschreibung gebunden - wieso murkst Du da noch mit meinem data rum?

Und meine Schleife war doch nur eine Demo für die vier verschiedenen Datensätze des Beispiels. Die musst Du doch nicht übernehmen.

Sorry, aber ich glaube Du musst Dich noch viel mehr mit den Grundlagen befassen! Datentypen, Funktionen und Rückgabewerte, den Scope von Namen, das Binden von Objekten an Namen, usw.

Wenn der RegExp nicht gefunden wird, dann gibt search eben None zurück - das hat dann auch keine Methode groupdict. Für die Praxis musst Du den Fehler abfangen oder das Ergebnis von search an einen Namen binden und erst bei Erfolg das Dict dort rausholen.

Nobuddy

(Themenstarter)
Avatar von Nobuddy

Anmeldungsdatum:
2. September 2005

Beiträge: 6990

Wohnort: 29614 Soltau

Ich gebe zu, hier mit einem großen Fragezeichen zu stehen!

Bis dahin sollte es ja noch in Ordnung sein

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

### Import Module
from datetime import date
now = date.today()
heute = now.strftime('%Y.%m.%d-')

import re
import os
import string
import csv



### Basis-Infos
# Quellliste für Lieferanten-Produktdaten
quellliste_subdir = 'daten'	# Ordner für Datei
quellliste_filename = '{}liste.txt'.format(heute)	# Namen der Datei
quellliste_path = os.path.join(os.path.dirname(__file__),  quellliste_subdir, quellliste_filename)	# Pfad zur Datei inklusive Dateinamen


### Programm
# Quelldatei Lieferanten-Produktdaten öffnen
# Kontrolle, ob Quelldatei vorhanden
with open(quellliste_path, "r") as in_file:
	reader = csv.reader(in_file, delimiter="\t")

Als nächstes kommt dann dies dazu

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
	# Zeilenweise aus CSV-Liste auslesen
	for row in reader:
		beschreibung = row[3]
		inhaltsangabe = row[25]
		inhalt = row[26]

		# RegExp
		regexp = re.compile(r"INHALT: ?(?P<VALUE>\d*\.?\d*)\s*(?P<UNIT>\w*)", re.U|re.I)

		# Wenn Spalte inhalt keinen Wert hat
		# Überprüfe, ob in Spalte beschreibung eine Inhaltsangabe enthalten ist
		if inhalt == '':
			result = re.search(regexp, beschreibung).groupdict()

Liege ich bis dahin richtig?

Antworten |