Forum: PC-Programmierung Script schreiben, der .csv liesst und path nach bestimmten Endung durchsucht


von galilio12 (Gast)


Lesenswert?

Hallo zusammen,

ich möchte einen Script, der .csv datei liesst und Path rekursiv nach 
bestimmten Endungen (.qml) durchsucht.

Das .csv Datei sieht wie folgende aus:

Import,Version number
import QtQuick,2.9
import QtQuick.XmlListModel,2.0
import QtQuick.Particles,2.0
import QtQuick.Window,2.3
import QtQuickControls,1.5
import QtQuick.Controls,2.2
import QtQuick.Dialogs,1.2
import QtQuick.Layouts,1.3

Idee wäre der Path rekursiv nach diesem Endungen (.qml) zu durchsuchen 
und dann die die gefunden Datei nach diesem .csv zu durchsuchen.

Ich muss zugeben, dann ich in einen Anfänger was Python angeht.

Folgende habe ich versucht:
1
import argparse
2
# from enum import Enum
3
import os.path
4
import csv
5
import sys
6
import pprint
7
# import itertools
8
# from pathlib import Path
9
# import traceback
10
import pathlib
11
import os
12
import glob
13
14
__version__ = 'v1.00'
15
16
csv_importFile_Path = pathlib.Path("importFile.csv")
17
inputPath =  "C:\temp"
18
qmlPath = "D:\\temp"
19
20
21
class CheckQtQuickImport:
22
23
    def __init__(self, inputPath):
24
        "Initialize the class members"
25
        self.version = __version__
26
        self._setInPath(inputPath)
27
28
    def check_csv_path(self):
29
        exist = False
30
        if(os.path.exists(csv_importFile_Path)):
31
            print("File", csv_importFile_Path, "exist")
32
            exist = True
33
        else:
34
            print("File", csv_importFile_Path, "does not exist!!")
35
            exist = False
36
        return exist
37
38
    def csv_dict_list(self, csv_importFile_Path):
39
        with open(csv_importFile_Path, 'r') as fh:
40
            reader = csv.DictReader(fh)
41
            dict_list = []
42
            for row in reader:
43
                dict_list.append(row)
44
                print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
45
                # print("dict_list", dict_list)
46
                # print(dict(row))
47
                print ("----------------------------------------")
48
                print(row['Import'], row['Version number'])
49
                # print("-----------------------------------------")
50
                # print(row['Import'])
51
                # print("----------------------------------------")
52
                # print(row['Version number'])
53
                # print("----------------------------------------")
54
            # print('*****************', len(dict_list))
55
            print("dict_list[5]", dict_list[5])
56
            print("key", reader.line_num)
57
            return dict_list
58
59
    def findAncheckQuickImport(self, qmlPath):
60
        print("hello Check Start")
61
        with open(qmlPath) as f:
62
            # TODO qmlPath check
63
            dicList= self.csv_dict_list(csv_importFile_Path)
64
            print("test", dicList)
65
            if 'import QtQuick' in f.read():
66
                print("true-----------")
67
68
69
    def getQML(self):
70
        count = 0
71
        for filename in glob.iglob(self.inPathname + '/**/*.qml', recursive=True):
72
            count+=1
73
            nameList = []
74
            nameList.append(filename)
75
            # TODO searchMetho
76
            # self.findAncheckQuickImport(filename)
77
            print(nameList, sep = "\n")
78
79
        print("number of QML file : ", count)
80
        print("---------nameList of QML File start")
81
        return nameList
82
83
    def _setInPath(self, inputPath):
84
        self.inPathname = inputPath
85
86
if __name__ == '__main__':
87
88
    my_CheckQtQuickImport = CheckQtQuickImport(inputPath)
89
    print("Hello CheckQtQuickImport!")
90
    my_CheckQtQuickImport.check_csv_path()
91
    # my_CheckQtQuickImport.findAncheckQuickImport(qmlPath)
92
    # my_CheckQtQuickImport.openCSVFile()
93
    my_CheckQtQuickImport.csv_dict_list(csv_importFile_Path)
94
    # Calls the csv_dict_list function, passing the named csv
95
    # device_values = my_CheckQtQuickImport.csv_dict_list(variables_file)
96
    # print(device_values)
97
    print("\n")
98
    # Prints the results nice and pretty like
99
    # print("#############################################################################")
100
    # print(my_CheckQtQuickImport.csv_dict_list(variables_file))
101
    # pprint.pprint(device_values)
102
    my_CheckQtQuickImport.getQML()

von stoneage-sysadmin (Gast)


Lesenswert?

Ich bin mir nicht sicher, ob ich die Aufgabe richtig verstehe. Geht es 
darum, in D:\TEMP und allen Unterverzeichnissen die Dateien

QtQuick.qml
QtQuick.XmlListModelqml
QtQuick.Particles.qml
etc...

zu finden?

Das ließe sich mit einfachen Shell-Bordmitteln (die gibt's auch für 
Windows) lösen.

sed -ne 's/^import \([^,]*\),.*/find 'D:/TEMP' -name "\1.qml"/p' \
  infile.csv \
| tee generiertes-find-script-zum-anschauen.sh \
| bash

(dritte Zeile mit tee ist optional, zum Debuggen)

Funktionsweise: Baue "import filename version" durch einfache 
Textersetzung zu einem Find-Kommando um und führe es aus.

Annahme: Du bist sicher, dass im Input keine Schweinereien wie 
Backticks, Dollars oder Beistriche sind. Die Methode ist nicht besonders 
Security-lastig, einzig blanks im Filenamen sollte sie aushalten :-/

von Dave4 (Gast)


Lesenswert?

Ich verstehe die Aufgabe ehrlich gesagt nicht ganz. Soll die CSV 
vielleicht geschrieben werden?

von Miss Ratgeber (Gast)


Lesenswert?

> ich möchte einen Script, der .csv datei liesst und Path rekursiv nach
> bestimmten Endungen (.qml) durchsucht.

Du solltest erstmal Deutsch lernen.
Die Problembeschreibung ist viel zu multivalent (=mehrdeutig).

von galilio12 (Gast)


Lesenswert?

Hat jemenden vielleicht eine Idee???

Danke

von galilio12 (Gast)


Lesenswert?

Bei diese Aufgabe geht es darum QML datei zu suchen.

Ist diese getun dann nach einen bestimmten String durchsuchen und zwar 
Datei für Datei.

idee ist:(Haben alle QML File die richtige Import)

von galilio12 (Gast)


Lesenswert?

Dave4 schrieb:
> Ich verstehe die Aufgabe ehrlich gesagt nicht ganz. Soll die CSV
> vielleicht geschrieben werden?

nein
Die csv werden nur gelesen

von galilio12 (Gast)


Lesenswert?

Die csv datei beinhalten die Import, die bei der QML Datei zu prüfen 
sind

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

und welche "Aufgabe" hat die csv Datei im Zusammenhang zu den .qml 
Dateien?

du schriebst":

"einen Script, der .csv datei liesst und Path rekursiv nach
bestimmten Endungen (.qml) durchsucht."

--> In der csv-Datei stehen also eine oder mehrere (Grund-) Pfade drin, 
und am diesen Pfaden soll rekursiv nach .qml Dateien gesucht werden?

Meine Glaskugel vermutet folgendes könnet gemeint sein:


suchdatei.csv:
  c:\temp\
  d:\daten\hugo\

--> alle Dateien c:\temp\*.qml sowie weitere *.qml in allen 
Unterverzeichnissen von C:\temp\* sollen gefunden und aufgelistet 
werden? [sinngemäss auch in D:\daten\hugo]

Output wäre dann in etwa:
c:\temp\irgendwas.qml
c:\temp\ramsch\wasanderes.qml
d:\daten\hugo\projekt1\trullala.qml

--> Soll die Ausgabe in eine weitere Datei erfolgen, oder reicht es aus, 
die Ausgabe auf dem Bildschirm anzusehen?


------
Wenn meine Glaskugel trübe ist:

könntest du bitte mal entsprechend meinem obigem Beispiel den exakten 
"input" und den "output" hier hin schreiben ?

: Bearbeitet durch User
von galilio12 (Gast)


Lesenswert?

Wegstaben V. schrieb:
> und welche "Aufgabe" hat die csv Datei im Zusammenhang zu den .qml
> Dateien?

Die csv Datei beinhaltet die String, die bei qml Dateien zu durchsuchen.
Statt einen hardcodiert string in code zu geben, war die Idee einen csv 
Datei schreiben und dann die zu prüfenden String von dort zu holen.

Wegstaben V. schrieb:
> du schriebst":
>
> "einen Script, der .csv datei liesst und Path rekursiv nach
> bestimmten Endungen (.qml) durchsucht."
>
> --> In der csv-Datei stehen also eine oder mehrere (Grund-) Pfade drin,
> und am diesen Pfaden soll rekursiv nach .qml Dateien gesucht werden?

@nein
die csv beinhaltet genau diesen zeilen:
1
Import,Version number
2
import QtQuick,2.9
3
import QtQuick.XmlListModel,2.0
4
import QtQuick.Particles,2.0
5
import QtQuick.Window,2.3
6
import QtQuickControls,1.5
7
import QtQuick.Controls,2.2
8
import QtQuick.Dialogs,1.2
9
import QtQuick.Layouts,1.3

Wegstaben V. schrieb:
> --> Soll die Ausgabe in eine weitere Datei erfolgen, oder reicht es aus,
> die Ausgabe auf dem Bildschirm anzusehen?

Nein
Diese Script wird aus(Qt)UnitTest ausgeführt und wenn es fehler schlägt 
dann der Fehlergrund und die betroffene QML File ausgeben.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

galilio12 schrieb:
> Die csv Datei beinhaltet die String, die bei qml Dateien zu durchsuchen.

Also möchtest du folgendes?

Ab einem gewissen Basis-Pfad (incl. rekursives tiefer gehen in weitere 
Unterverzeichnisse) sollen alle .qml Dateien nach den Suchmustern 
durchsucht werden, welche in deiner .csv Datei hinterlegt sind.

galilio12 schrieb:
> und wenn es fehler schlägt
> dann der Fehlergrund und die betroffene QML File ausgeben.

Aha. Und welche Fehler sind das nun genau? Das könnte z.B. sein:
- in verschiedenen Pfaden sind generell keine .qml Dateien vorhanden
- nicht alle der genannten 8 Strings sind genau so in einer zu 
untersuchenden  .qml Datei vorhanden
- der String ist vorhanden, aber die Versionsnumemr stimmt nicht überein

von galilio12 (Gast)


Lesenswert?

Wegstaben V. schrieb:
> Aha. Und welche Fehler sind das nun genau? Das könnte z.B. sein:
> - in verschiedenen Pfaden sind generell keine .qml Dateien vorhanden
Das ist nicht als Fehler vorgesehen
> - nicht alle der genannten 8 Strings sind genau so in einer zu
> untersuchenden  .qml Datei vorhanden
Diese auch nicht
> - der String ist vorhanden, aber die Versionsnumemr stimmt nicht überein
diese ja
z.B:
Das QML File wird auf folgende untersucht:
z.B Ist die:
1)"import QtQuick" vorhanden, dann muss die Versionsnummer geprüft 
werden.
2)Ist "import QtQuick" dann weitersuchen (also next string und so 
weiter)

von Rolf M. (rmagnus)


Lesenswert?

Mein Verständnis:
Im Prinzip sollen in der qml-Datei alle Zeilen (außer der ersten) 
gefunden werden, die mit einem der Einträge in der ersten Spalte des 
.cvs beginnen. Für jeden Fund soll geprüft werden, ob darauf der Wert 
der zweiten Spalte folgt oder nicht.

Beispiel:

CSV-Datei:
galilio12 schrieb:
1
Import,Version number
2
import QtQuick,2.9
3
import QtQuick.XmlListModel,2.0
4
import QtQuick.Particles,2.0
5
import QtQuick.Window,2.3
6
import QtQuickControls,1.5
7
import QtQuick.Controls,2.2
8
import QtQuick.Dialogs,1.2
9
import QtQuick.Layouts,1.3

In der .qml-Datei steht
1
import QtQuick 2.9
2
import QtQuick.Controls 2.5

Dann soll das Skript für die zweite Zeile einen Fehler ausgeben, da dort 
2.2 statt 2.5 stehen müsste.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Rolf M. schrieb:
> Mein Verständnis:
> ...

JA, das habe ich auch so verstanden bzw. "erarbeitet".

Das Manko des Thread-Eröffners (nicht nur seins) ist halt, das er "das 
Problem" nicht präzise genug beschreiben kann (konnte).

Wnn man in der Lage ist, ein Problem "genau" zu beschreiben (incl. der 
Randbedingungen), dann ist man ja auch schon auf halben Weg zur Lösung

Ob oder wie die Such-Anforderung in Python aussieht, oder ob das oben 
formulierte die Aufgabe erfüllt, weiss ich leider nicht.

: Bearbeitet durch User
von Einer (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang eine Javascript-Variante...

Viel Spaß!

von Sheeva P. (sheevaplug)


Lesenswert?

galilio12 schrieb:
> Die csv Datei beinhaltet die String, die bei qml Dateien zu durchsuchen.
> Statt einen hardcodiert string in code zu geben, war die Idee einen csv
> Datei schreiben und dann die zu prüfenden String von dort zu holen.
> [...]
>
1
> Import,Version number
2
> import QtQuick,2.9
3
> import QtQuick.XmlListModel,2.0
4
> import QtQuick.Particles,2.0
5
> import QtQuick.Window,2.3
6
> import QtQuickControls,1.5
7
> import QtQuick.Controls,2.2
8
> import QtQuick.Dialogs,1.2
9
> import QtQuick.Layouts,1.3
10
>

Du möchtest Deinen Librarypfad rekursiv durchsuchen, in jede dort 
gefundene .qml-Datei schauen, die Versionsnummer extrahieren und dann 
schauen, ob die Version mit der in Deiner CSV-Datei hinterlegten 
übereinstimmt?

von Rolf M. (rmagnus)


Lesenswert?

Sheeva P. schrieb:
> Du möchtest Deinen Librarypfad rekursiv durchsuchen,

Nein, er möchte das Verzeichnis mit seinen QML-Dateien rekursiv 
durchsuchen.

> in jede dort gefundene .qml-Datei schauen, die Versionsnummer extrahieren

Nicht die Versionsnummer der QML-Datei, sondern die Versionsnummern 
aller darin enthaltenen import-Anweisungen. In QML gibt man beim 
Einbinden eines Moduls per import immer mit an, welche Version man will.

>  und dann schauen, ob die Version mit der in Deiner CSV-Datei hinterlegten
> übereinstimmt?

Ja. Er möchte offenbar sicherstellen, dass alle seine QML-Dateien die 
selbe Version eines jeweiligen Moduls einbinden.

von Sheeva P. (sheevaplug)


Lesenswert?

Rolf M. schrieb:
> Sheeva P. schrieb:
>>  und dann schauen, ob die Version mit der in Deiner CSV-Datei hinterlegten
>> übereinstimmt?
>
> Ja. Er möchte offenbar sicherstellen, dass alle seine QML-Dateien die
> selbe Version eines jeweiligen Moduls einbinden.

Hmmm... ich hab' mir gerade mal was gebastelt und in die Verzeichnisse 
von Orange Data Mining [1] geschaut, und heraus kommt:

--snip-----
     34 QtQuick 2.0
     52 QtQuick 2.1
    131 QtQuick 2.2
      1 QtQuick 2.3
      4 QtQuick 2.4
     18 QtQuick 2.5
      6 QtQuick 2.6
      6 QtQuick 2.8
      1 QtQuick 2.9
    254 QtQuick 2.10
--snap-----

Ich hab' seit Qt4 nichts mehr mit Qt gemacht und kenne QML auch nur vom 
Hörensagen. Aber mir scheint, daß in so einem Projekt offenbar mehrere 
Versionen derselben QML-Library (?) angezogen werden und womöglich sogar 
koexistieren können? Hat so eine Art Test dann überhaupt einen Sinn?


[1] https://orange.biolab.si/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.