Forum: PC-Programmierung CVE Meldungen lokal oder auf Server einlesen/filtern


von Alex (Gast)


Lesenswert?

Guten Morgen zusammen,

ich habe eine Frage zur Softwareentwicklung und zwar kennt 
wahrscheinlich der ein oder andere diese Datenbank: 
https://cve.mitre.org/data/downloads/index.html

Ich würde gerne diese CVE Meldungen automatisieren, also das im Prinzip 
die Mailinglisten oder Feeds dort (bin mir nicht sicher was da zur 
Verfügung steht) automatisch gescannt und nur die Teile der 
Open-Source-Software dann ausgegeben werden.

Das müsste ja irgendwie geskriptet werden. Es könnte sich dabei um ein 
einfaches Tool handeln, dass 1x pro Tag aufgerufen wird oder auch etwas, 
dass auf einem Server läuft und automatisiert 1x pro Tag eine Abfrage 
startet.

Die Programmiersprache spielt an sich keine Rolle. XML sollte es nicht 
sein, da die Syntax sehr gewöhnungsbedürftig ist. Mit C/C++ und ein 
bishen Java bin ich vertraut. Theoretisch würde auch ein Tool reichen, 
wo einfach die Daten von der Webseite abgerufen und in eine txt-Datei 
abgelegt werden.

Das Ablegen in eine Datei ist ja kein Problem, da es dafür genügend 
fstream-Funktionen gibt. Aber erst einmal interessiert mich, wie ich die 
Daten vom oben angegebenen Link auf meinem Rechner über ein einfaches 
Tool bekomme? Natürlich wäre ein google-spreedsheet was feines. Auch 
über Exel wäre sowas denkbar, aber für den Anfang wäre ein einfaches 
C/C++ oder Java Programm am sinnvollsten. Oder über eine Skriptsprache 
entweder lokal oder auf einem Server. Ich hoffe, dass hier einige 
Experten sind, die mir helfen können.

Am Ende sollten die Datei in einem Dokument auf google-Drive auftauchen 
und verschiedenen Statusmeldungen haben, aber davon bin ich noch weit 
entfernt.

von Altenpfleger (Gast)


Lesenswert?

wget url-zur-liste
Danach xml-datei öffnen und mit xml.-parser deiner Wahl durchsuchen.

Wo ist jetzt dein Problem?

von Alex (Gast)


Lesenswert?

Ich habe jetzt eine Lösung, wo ich mithilfe von Python die csv 
herunterlade und anschließend die erste Spalte nach Schlüsselwörtern 
durchsuche:

with open('allitems.csv', 'rb') as csvfile:
header = next(csvfile).strip("\n").split(",")
reader = csv.reader(csvfile)
results = filter(lambda row: row[0] == {'Test1', Test2}, list(reader))

Nur was ist, wenn ich in row[0] ganze Sätze habe, und nur nach 
Schlüsselwörtern suchen möchte und anschließend diese Zeile komplett 
ausgeben möchte?

von Altenpfleger (Gast)


Lesenswert?

Alex schrieb:
> Nur was ist, wenn ich in row[0] ganze Sätze habe, und nur nach
> Schlüsselwörtern suchen möchte und anschließend diese Zeile komplett
> ausgeben möchte?
Man holt sich halt erst mal den gesamten Spalteneintrag,
den sucht man dann nach seinen Schlüsselwörtern, dann den nächsten....

Sorry nutze kein Python.

von Kaj (Gast)


Lesenswert?

Alex schrieb:
> Nur was ist, wenn ich in row[0] ganze Sätze habe, und nur nach
> Schlüsselwörtern suchen möchte und anschließend diese Zeile komplett
> ausgeben möchte?

Sinngemaess:
1
if "keyword" in row[0]:
2
    print(row[0])

von Alex (Gast)


Lesenswert?

gibt es eine moglichkeit, das ganze mit Java oder c++ zu lösen ? also 
die Datei herunterladen, CSV Datei bzw Zeilen nach Schlüsselwörtern 
durchsuchen und dann die entsprechenden Zeilen zusammenführen und in 
eine neue Datei speichern ? das ganze eventuell auf einem server.

von Altenpfleger (Gast)


Lesenswert?

Alex schrieb:
> gibt es eine moglichkeit, das ganze mit Java oder c++ zu lösen ?
Ja aber nur gegen Geld.

von Kaj (Gast)


Lesenswert?

Alex schrieb:
> gibt es eine moglichkeit, das ganze mit Java oder c++ zu lösen ? also
> die Datei herunterladen, CSV Datei bzw Zeilen nach Schlüsselwörtern
> durchsuchen und dann die entsprechenden Zeilen zusammenführen und in
> eine neue Datei speichern ?
Klar geht das, aber warum? Leichter als mit Python wird es in C++ ganz 
sicher nicht. Ganz im Gegenteil...

von Kaj (Gast)


Lesenswert?

Alex schrieb:
> with open('allitems.csv', 'rb') as csvfile:
Warum willst du eine Textdatei im binaermodus oeffnen? Probleme beim 
oeffnen/lesen? Einfach das richtige encoding benutzen.
1
f = open('allitems.csv', 'r', encoding='iso-8859-15')

von Kaj (Gast)


Lesenswert?

Ist nicht schoen, aber so koennte man anfangen:
1
#!/usr/bin/env python
2
3
4
def main():
5
    keyword = 'cve-2017-'   #   as example: all cve from 2017
6
    path = 'allitems.csv'
7
8
    f = open(path, 'r', encoding='iso-8859-15')
9
    content = f.read().strip().splitlines()
10
    f.close()
11
12
    result = (r for r in content if keyword in r.lower())   # using r.lower() so
13
                                                            # it is anyway if we
14
                                                            # write cve or CVE
15
16
    for r in result:
17
        print(r)
18
19
20
if __name__ == '__main__':
21
    main()
Jede Zeile die das 'keyword' enthaelt wird in den Generator 'result' 
geparkt

von Alex (Gast)


Lesenswert?

Das habe ich bereits so ähnlich gelöst. Es funktioniert auch. Aber mit 
python bricht der Download bei ca. 22% stets ab:
1
import urllib2
2
3
url = "items.csv"
4
filename = url.split('/')[-1]
5
6
u = urllib2.urlopen(url)
7
f = open(filename, 'wb')
8
meta = u.info()
9
file_size = int(meta.getheaders("Content-Length")[0])
10
11
print "Downloading: %s Bytes: %s" % (filename, file_size)
12
13
file_size_dl = 0
14
block_sz = 80024
15
while True:
16
    buffer = u.read(block_sz)
17
    if not buffer:
18
        break
19
    file_size_dl += len(buffer)
20
    f.write(buffer)
21
    status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
22
    status = status + chr(8)*(len(status)+1)
23
    print status,
24
25
f.close()

Und hier die Suche entsprechend der Keywors:
1
import csv
2
3
results=[]
4
keywords=["REJECT", "DISPUTED"]
5
6
with open('allitems.csv', 'rb') as csvfile:
7
    # handle header line, save it for writing to output file
8
    header = next(csvfile).strip("\n").split(" ")
9
    reader = csv.reader(csvfile, delimiter=',')
10
    #results = filter(lambda row: row[2] == 'Buffer', list(reader))
11
12
    for row in reader:
13
        for key in keywords:
14
            if key in row[2]:
15
                print(row[0])
16
                results.append(row)
17
18
    
19
with open('newallitems.csv', 'wb') as outfile:
20
    writer = csv.writer(outfile)
21
    writer.writerow(header)
22
    for result in results:
23
        writer.writerow(result)

Klasse wäre, wenn man jetzt eine Möglichkeit hätte, eine Vergleich 
zwischen Downloadfile und aktueller tabelle bezüglich neuer Meldungen 
anzustellen.


Ich habe alternativ auch eine zweite Lösung mittels Java. Hier der Teil, 
der eine komplette Zeile nach Schlüsselwörtern durchsucht.
1
import com.opencsv.CSVReader;
2
import java.io.FileReader;
3
import java.io.IOException;
4
import java.util.*;
5
import java.io.*;
6
7
public class HelloWorld {
8
9
    public static void main(String[] args) throws IOException 
10
    {
11
        String fileName = "allitemsnew.csv";
12
        
13
        CSVReader reader = new CSVReader(new FileReader(fileName)); 
14
            String[] nextLine;
15
    
16
            while ((nextLine = reader.readNext()) != null) 
17
            {
18
                
19
                for (String fstring: nextLine) 
20
                {
21
                  
22
                   if (fstring.contains("XnView Classic for Windows")) 
23
                   {
24
                     System.out.format("%s ", fstring);
25
                     }
26
                }
27
             }
28
    }
29
}


Problem hierbei ist nur, dass eben komplette Zeilen gelesen werden. 
Eleganter wäre es, wenn ich die Elemente durch ";" im CSV trennen 
könnte, um beispielsweise nur das erste Array-Element zu durchsuchen.

von Kaj (Gast)


Lesenswert?

Alex schrieb:
> Aber mit
> python bricht der Download bei ca. 22% stets ab:
Bei mir (OS: Linux) laeuft der Download mit deinem Code durch. Daran 
liegt es also nicht. Kann es sein, dass der Server die Verbindung 
unterbricht? Kommt denn irgendeine Fehlermeldung (abbruch) oder bleibt 
das Script einfach haengen?

Alex schrieb:
> Klasse wäre, wenn man jetzt eine Möglichkeit hätte, eine Vergleich
> zwischen Downloadfile und aktueller tabelle bezüglich neuer Meldungen
> anzustellen.
Was meinst du mit 'aktueller Tabelle'? Meinst du das, was du dir schon 
rausgesucht hast?
Erstell dir doch eine kleine Datenbank (SQLite) wo du die fuer dich 
wichtigen CVE reinschreibst. Wenn du die CSV-Datei erneut runterlaedst 
brauchst du nur gucken ob da CVE drin sind die dich interessieren, und 
wenn ja, einfach gucken ob die schon in deiner DB steht. Wenn nein, dann 
einfuegen in die DB.

Ansonsten mit einem diff-Tool (meld, winmerge, etc.) deiner wahl.

von Alex (Gast)


Lesenswert?

Das Script bleibt einfach hängern.

Ich habe jetzt die einfachste aller Lösungen gefunden und zwar mit 
google Drive.
1
function importCSVFromWeb() {
2
  
3
  // Provide the full URL of the CSV file.
4
  var csvUrl = "allitems.csv";
5
  var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
6
  var csvData = Utilities.parseCsv(csvContent);
7
  
8
  var sheet = SpreadsheetApp.getActiveSheet();
9
  sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
10
  
11
}

Problem hierbei ist nur, dass immer die komplette CSV geladen wird, 
statt einfach die neuen Einträge hinzuzufügen. Zweitens: Wie kann mir 
automatisiert bei Google Drive im Excelfile nur die Einträge anzeigen 
lassen, die ich anhand von keywords prüfe?

von Alex (Gast)


Lesenswert?

Ach so, und das dritte Problem ist, dass nicht die vollständige Datei in 
die Exceltabelle gepackt wird mit dem oben genannten Code.

von Kaj (Gast)


Lesenswert?

Alex schrieb:
> Das Script bleibt einfach hängern.
Wie waere es, wenn du einfach mal versuchst festzustellen, warum und 
an welcher Stelle dein Script haengen bleibt, anstatt wild 
irgendwelche loesungen (in den unterschiedlichsten Sprachen) zu 
kopieren?

von Alex (Gast)


Lesenswert?

Das Problem mit dem Python-Download könnte alles mögliche sein, wenn es 
auf dem einen Rechner funktioniert und auf dem anderen nicht.

Das Problem mit Google Drive ist nicht so einfach. Ich möchte eine Datei 
in Exycel einlesen, nutze dafür Standardbefehle, erhalte aber nur einen 
Teil der Daten.

von Kaj (Gast)


Lesenswert?

Alex schrieb:
> Das Problem mit dem Python-Download könnte alles mögliche sein, wenn es
> auf dem einen Rechner funktioniert und auf dem anderen nicht.
Ja, genau deswegen sollte man da vielleicht mal gucken, weshalb es bei 
dir nicht funktioniert, anstatt wild zig Dinge zu probieren.

Hab das ganze jetzt mal an Python3 angepasst
1
#!/usr/bin/env python3
2
3
import urllib.request
4
5
6
def download_cve(download_url, path_to_save_download):
7
    """
8
    """
9
10
    request_result = urllib.request.urlopen(download_url)
11
    result_code = request_result.getcode()
12
13
    if result_code != 200:
14
        msg = 'HTTP Response Code is not 200, it is: {}'.format(result_code)
15
        raise Exception(msg)
16
17
    content_size = int(request_result.getheader('Content-Length'))
18
    print('Downloading [{}] Bytes'.format(content_size))
19
20
    print('Please wait while downloading data...')
21
    download = request_result.read().decode('iso-8859-15')
22
    print('download: done!')
23
24
    print('write data to file...')
25
    f = open(path_to_save_download, 'w', encoding='utf-8')
26
    f.write(download)
27
    f.close()
28
    print('write: done!')
29
30
31
def seek_keywords(file_name, list_of_keywords):
32
    """
33
    """
34
35
    cve_file = open(file_name, 'r', encoding='utf-8')
36
    cve_content = cve_file.read().strip().splitlines()
37
    cve_file.close()
38
39
    result = []
40
41
    for line in cve_content:
42
        for key in list_of_keywords:
43
            if key in line:
44
                result.append(line)
45
46
    new_cve = open('new.csv', 'w', encoding='utf-8')
47
48
    for line in result:
49
        new_cve.write(line + '\n')
50
51
    new_cve.close()
52
53
54
def main():
55
    url = 'https://cve.mitre.org/data/downloads/allitems.csv'
56
    filename = 'items.csv'
57
    keywords = ['REJECT', 'DISPUTED']
58
59
    download_cve(url, filename)
60
    seek_keywords(filename, keywords)
61
62
63
if __name__ == '__main__':
64
    main()

von Kaj (Gast)


Lesenswert?

Hier nochmal mit schoener Fortschrittsanzeige (die nicht die Konsole 
vollspamt...), getestet mit Python 3.6.2 auf Linux
1
#!/usr/bin/env python3
2
3
import urllib.request
4
import sys
5
6
7
def download_cve(download_url, path_to_save_download):
8
    """
9
    """
10
11
    # open url and get http statuscode
12
    request_result = urllib.request.urlopen(download_url)
13
    result_code = request_result.getcode()
14
15
    if result_code != 200:
16
        msg = 'HTTP Response Code is not 200, it is: {}'.format(result_code)
17
        raise Exception(msg)
18
19
    # get size of the downloadfile
20
    content_size = int(request_result.getheader('Content-Length'))
21
22
    one_percent = content_size // 100       #   integer division
23
    pivots = ['-', '\\', '|', '/']
24
    percent = 0
25
    download = ''
26
27
    print('\nDownloading [{}] Bytes'.format(content_size))
28
    while content_size > 0:
29
        for p in pivots:
30
            if content_size >= one_percent:
31
                download += request_result.read(one_percent).decode('iso-8859-15')
32
                content_size = content_size - one_percent
33
                percent += 1
34
            else:
35
                download += request_result.read(content_size).decode('iso-8859-15')
36
                content_size = 0
37
                break
38
            print_progress('  {0} Download Progress {0} {1:3}% {0}\r'.format(p, percent))
39
    else:
40
        print_progress('  {0} Download Progress {0} {1:3}% {0}\n'.format(p, percent))
41
        print('Download done!')
42
43
    print('write data to file...')
44
    f = open(path_to_save_download, 'w', encoding='utf-8')
45
    f.write(download)
46
    f.close()
47
    print('write done!')
48
49
50
def seek_keywords(input_filename, output_filename, list_of_keywords):
51
    """
52
    """
53
54
    cve_file = open(input_filename, 'r', encoding='utf-8')
55
    cve_content = cve_file.read().strip().splitlines()
56
    cve_file.close()
57
58
    new_cve = open(output_filename, 'w', encoding='utf-8')
59
60
    for line in cve_content:
61
        for key in list_of_keywords:
62
            if key in line:
63
                new_cve.write(line + '\n')
64
65
    new_cve.close()
66
67
68
def print_progress(msg):
69
    sys.stdout.write(msg)
70
    sys.stdout.flush()
71
72
73
def main():
74
    url = 'https://cve.mitre.org/data/downloads/allitems.csv'
75
    download_filename = 'items.csv'
76
    output_filename = 'new.csv'
77
    keywords = ['REJECT', 'DISPUTED']
78
79
    download_cve(url, download_filename)
80
    seek_keywords(download_filename, output_filename, keywords)
81
82
83
if __name__ == '__main__':
84
    main()

von Sheeva P. (sheevaplug)


Lesenswert?

Alex schrieb:
> ich habe eine Frage zur Softwareentwicklung und zwar kennt
> wahrscheinlich der ein oder andere diese Datenbank:
> https://cve.mitre.org/data/downloads/index.html
>
> Ich würde gerne diese CVE Meldungen automatisieren, also das im Prinzip
> die Mailinglisten oder Feeds dort (bin mir nicht sicher was da zur
> Verfügung steht) automatisch gescannt und nur die Teile der
> Open-Source-Software dann ausgegeben werden.

Dein gesamter Beitrag ist für mich etwas verwirrend; das geht schon in 
diesem Absatz los. Warum bist Du Dir nicht sicher, was da zur Verfügung 
steht? Das ist doch offensichtlich: es sind Abzüge der CVE-Datenbank in 
unterschiedlichen Formaten. Die gibt es als jährliche oder vollständige 
Abzüge im XML-basierten CVRF-Format, oder als vollständige Abzüge in den 
Formaten XML, HTML, Text und CSV.

Ansonsten ist zu beachten, daß es immer nur entweder vollständige oder, 
im XML-basierten CVRF-Format, auch jährliche Abzüge gibt -- aber, und 
das ist der springende Punkt, keine Aktualisierungen (Deltas). Damit 
kannst Du auf zwei Lösungswegen umgehen: entweder, Du lädst jeden Tag 
die ganzen Daten herunter, bildest lokal selbst das Delta, und spielst 
es in Deine bereits erzeugte Datei ein. Oder Du Du erzeugst das Dokument 
täglich neu, ohne den Zwischenschritt über die Deltas zu gehen. Bei der 
hier in Rede stehenden geringen Datenmenge würde ich zur zweiten Methode 
neigen.

Außerdem ist mir unklar, wie Du dort die Einträge für 
OpenSource-Software herausfiltern willst. In den Daten gibt es keinen 
Marker dafür, in welcher Art von Software die im jeweiligen Datensatz 
beschriebene Schwachstelle aufgefunden worden ist. Das würde auch 
ziemlich schwierig, denn es gibt keine wirklich trennscharfe, eindeutige 
Unterscheidung.

> Die Programmiersprache spielt an sich keine Rolle. XML sollte es nicht
> sein, da die Syntax sehr gewöhnungsbedürftig ist. Mit C/C++ und ein
> bishen Java bin ich vertraut. Theoretisch würde auch ein Tool reichen,
> wo einfach die Daten von der Webseite abgerufen und in eine txt-Datei
> abgelegt werden.

XML ist keine Programmiersprache, sondern, vereinfacht gesagt, nur ein 
Dokumentenformat. Es gibt eine Transformationssprache für XML namens 
XSLT, die ebenfalls auf XML basiert und, ja, wie XML selbst nicht 
besonders übersichtlich ist.

Schnelle, typsichere Programmiersprachen wie C, C++ oder Java erscheinen 
mir etwas überdimensioniert für Dein Problem. Dein Programm wird ohnehin 
den größten Teil seiner Zeit damit verbringen, die Daten herunterzuladen 
und ggf. zu entpacken, und die unkomprimierten Dateien haben ja 
lediglich überschaubare 80 (CSV) bzw. 150 MB (CVRF). Bei der 
eigentlichen Suche ist vermutlich primär der Algorithmus das Aufwändige 
-- da holst Du auch mit kompilierten Sprachen bei diesen kleinen 
Datenmengen nicht viel heraus.

> Das Ablegen in eine Datei ist ja kein Problem, da es dafür genügend
> fstream-Funktionen gibt. Aber erst einmal interessiert mich, wie ich die
> Daten vom oben angegebenen Link auf meinem Rechner über ein einfaches
> Tool bekomme? Natürlich wäre ein google-spreedsheet was feines. Auch
> über Exel wäre sowas denkbar, aber für den Anfang wäre ein einfaches
> C/C++ oder Java Programm am sinnvollsten. Oder über eine Skriptsprache
> entweder lokal oder auf einem Server. Ich hoffe, dass hier einige
> Experten sind, die mir helfen können.
>
> Am Ende sollten die Datei in einem Dokument auf google-Drive auftauchen
> und verschiedenen Statusmeldungen haben, aber davon bin ich noch weit
> entfernt.

Naja, die Daten auf den Rechner zu bekommen, ist vermutlich noch die 
leichteste Übung. Schwieriger wird es vermutlich, zunächst das Chaos 
zwischen Deinen Ohren zu beheben... ;-)

Im Prinzip kannst Du das Problem mit jeder Programmiersprache lösen, die 
Frage ist nur, wieviel Aufwand Du in die Sache investieren willst. Zudem 
stellt sich auch die Frage, wie Du die Daten speichern willst; mit einer 
modernen Skriptsprache wie Python oder Ruby kannst Du die komprimiert 
auf die Festplatte schreiben und dann direkt den entkomprimierten 
Plaintext aus der komprimierten Datei lesen.

Wie auch immer: Du solltest Dich für eine Programmiersprache entscheiden 
-- und zwar idealerweise jetzt -- und dann dabei bleiben. Es nutzt Dir 
nichts, die einfachen Teile x-mal in verschiedenen Sprachen zu 
implementieren und jedesmal, wenn die erste Schwierigkeit auftritt, zu 
einer anderen Sprache zu wechseln. Die schwierigeren Teile -- das Parsen 
der Datei(en) und die Suche oder Konvertierung in ein anderes Format -- 
werden in allen Sprachen ähnlich schwierig und aufwändig sein, in 
kompilierten Sprachen tendenziell sogar noch etwas schwieriger und 
aufwändiger.

von Sheeva P. (sheevaplug)


Lesenswert?

Alex schrieb:
> Ich habe jetzt eine Lösung, wo ich mithilfe von Python die csv
> herunterlade und anschließend die erste Spalte nach Schlüsselwörtern
> durchsuche:
>
>
1
> results = filter(lambda row: row[0] == {'Test1', Test2}, list(reader))
2
>

Meintest Du:
1
result = filter(lambda row: row[0] in {'Test1', 'Test2'}, reader)

Nachteil des "list(reader)" ist, daß der Code die Daten vollständig in 
den Arbeitsspeicher lädt. Das macht aus zwei Gründen keinen Spaß: 
erstens, weil größere Datenmengen dann sehr viel Speicher verbrauchen, 
zweitens, weil man am Ende dann einen riesigen Datenbatzen erhält, 
welchen man jetzt irgendwie weiter verarbeiten muß.

IMHO wäre es eleganter und wahrscheinlich schneller (das müßte man mal 
messen), etwas zu benutzen wie
1
result = [row for row in reader if row[0] in ('Test1', 'Test2')]

> Nur was ist, wenn ich in row[0] ganze Sätze habe, und nur nach
> Schlüsselwörtern suchen möchte und anschließend diese Zeile komplett
> ausgeben möchte?

Dann suchst Du halt andersherum, bei großen Datenmengen oder sehr vielen 
Suchstrings vielleicht sogar multi-threaded. ;-)

von RC (Gast)


Lesenswert?

Ich habe mich mit dem Thema auch auseinandergsetzt, da ich die Liste 
anhand bestimmter Schlüsselwörter filtern möchte. Ich habe das Ganze 
jedoch anders als Alex wie folgt gelöst:
1
import pandas as pd
2
import csv
3
4
# CVE-Meldungen einlesen
5
df = pd.read_csv('allitems.csv', delimiter=',',header=None,engine='python',usecols=range(0, 6), error_bad_lines=False)
6
7
# Dokument z.B. für GoogleDrive verkleinern, indem einfach Zeilen von X-Y (also ältere Meldungen) entfernt werden. Fängt bei Zeile 9 an, da Header unberührt bleiben soll
8
df = df.drop(df.index[9:80000]) 
9
10
# DataFrame erzeugen, um eine klare Trennung zwischen Header und Data-Zeilen zu gewährleisten. 
11
df_header = pd.DataFrame(df.iloc[:9])
12
df_rest = pd.DataFrame(df.iloc[9:])
13
14
# Spalte 0 und 2 nach Suchbegriffen durchsuchen wie z.B. CVE-2017
15
df_rest = pd.DataFrame(df_rest[df_rest[[0,2]].apply(lambda r: r.str.contains('CVE-2017', case=False).any(), axis=1)])
16
17
# Der Versuch, eine neue Spalte hinzuzufügen und nach vorne zu schieben, klappt nicht
18
#df_rest.insert(0,6,'new', allow_duplicates=False)
19
#df_rest.reindex(columns=[6,2,1,0])
20
21
# DataFrames zusammenführen
22
df = pd.concat([df_header, df_rest], axis=0)
23
24
# Schreibe in Tempfile
25
df.to_csv("temp.csv", index=False, header=None)#
26
 
27
# Temp kopieren und eine Vergleichsdatei erzeugen
28
dfnew=df.to_csv("allitemsnew.csv", index=False, header=None)
29
30
31
########################################################       
32
# Aktualisiert Meldungen
33
dfnew = pd.read_csv('allitemsnew.csv', delimiter=',', header=None,engine='python', usecols=range(0, 7), error_bad_lines=False)
34
35
# Wenn Originaldatei neue Meldungen hat, werden Sie in allitemsnew.csv aktualisiert. Problem: Wenn ich in allitemsnew aber irgendwo eine Änderung mache, wird diese immer überschrieben
36
dfnew = pd.merge(df, dfnew, how='outer')
37
dfnew.drop_duplicates(subset=[0], inplace=True, keep=False)
38
dfwrite=df.merge(dfnew, how='inner')
39
40
dfwrite.to_csv("allitemsnew.csv", index=False, header=None)

Das Ganze funktioniert an sich gut. Mein Problem: Ich möchte das Merging 
nur anhand der ersten Spalte "CVE-2017" durchführen oder anhand der 
Zeilennummern. Denn es kann ja sein, dass ich die neuen Meldungen aus 
Datei1 in Datei2 zwar aktualisieren möchte, aber dadurch Kommentare oder 
ähnliches in Datei2 nicht überschrieben werden sollen. Durch den obigen 
Code wird nämlich stets die gesammte Zeile aktualisiert, sobald in 
irgend einer Zelle eine Änderung auftritt. Eventuell hat jemand einen 
eleganteren Vorschlag.

Ziel ist es, Datei1 zu filtern, mit der älteren Datei2 zu vergleichen 
und neue Zeilen mit CVE-Meldungen aus Datei1 in Datei 2 zu 
aktualisieren. Gleichzeitig soll in Datei2 eine neue Spalte hinzugefügt 
werden, die aber nicht geupdatet werden soll, um Kommentare oder Notizen 
nicht zu überschreiben.

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.