Python 3.4: Match von csv und neue csv mit übereinstimmenden Werten zurückgeben

FRAGE

Wie kann ich den Leser csv für irgendwelche Items im reader2 csv scannen und einen neuen csv mit den übereinstimmenden Informationen zurückgeben.

Reader2 csv format

66740,1800,1001463,1467373,896159 

Leser csv-Format

 1001385|NORTHWEST PIPE CO|10-Q|2015-05-06|edgar/data/1001385/0001193125-15-174814.txt 1001426|PERICOM SEMICONDUCTOR CORP|10-Q|2015-05-05|edgar/data/1001426/0001145443-15-000628.txt 1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001386.txt 1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001394.txt 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001388.txt 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001390.txt 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001392.txt 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001396.txt 

Aktueller Code

 with open('newCIK.csv') as reader2: reader2 = csv.reader(reader2) with open('search.file') as f_in, open('SP500_10K.csv', 'w') as f_out: reader = csv.reader(f_in, delimiter='|') writer = csv.writer(f_out, delimiter='|') for line in reader: for cik in reader2: if cik in line: writer.writerow(line) 

  • Anhängen eines Headers für CSV-Datei?
  • Importieren einer CSV-Datei in eine sqlite3-Datenbanktabelle mit Python
  • Python Erstellen eines verschachtelten Wörterbuchs aus CSV-Datei
  • Pandas.read_csv () MemoryError
  • Pythonschleife wird auf dem zweiten Pass nicht iterieren
  • Leere Werte in Excel-Datei aus CSV (nicht nur Zeilen)
  • One Solution collect form web for “Python 3.4: Match von csv und neue csv mit übereinstimmenden Werten zurückgeben”

    Sie versuchen, ein Datei-Objekt als eine Liste zu behandeln, Schleifen über sie mehr als einmal. Das wird nicht funktionieren, ohne zusätzliche Arbeit zu machen. Außerdem schlagt man nicht über die Spalten der einen Reihe; Sie versuchen zu testen, ob die ganze Zeile in den anderen CSV-Datei-Zeilen ist. Sie möchten jeden Wert testen und dann nur gegen die letzte Spalte der Zeilen in den search.file CSV-Daten.

    Dateiobjekte haben eine Dateiposition ; Wie Sie aus der Datei lesen, bewegt sich die Position von Anfang bis Ende. Einmal am Ende wird es nicht automatisch wieder an den Start gehen .

    Du könntest das Dateiobjekt wieder anfangen:

     with open('newCIK.csv') as reader2_file: reader2 = csv.reader(reader2_file) with open('search.file') as f_in, open('SP500_10K.csv', 'w') as f_out: reader = csv.reader(f_in, delimiter='|') writer = csv.writer(f_out, delimiter='|') for line in reader: reader2_file.seek(0) # rewind to the start for cik in reader2: if cik in line: writer.writerow(line) 

    Allerdings ist das Lesen einer Datei immer und immer wieder langsam . Du würdest es besser sein, das Ganze am Anfang zu lesen. Und das oben genannte nicht das andere Problem, nämlich dass Sie jede Zeile testen und nicht jede Spalte von newCIK.csv .

    Lesen Sie die eine Zeile in den Speicher, dann Schleife über das:

     with open('newCIK.csv', newline='') as reader2: reader2 = csv.reader(reader2) cik_values = next(reader2) # first row with open('search.file', newline='') as f_in, open('SP500_10K.csv', 'w', newline='') as f_out: reader = csv.reader(f_in, delimiter='|') writer = csv.writer(f_out, delimiter='|') for line in reader: for cik in cik_values: if cik in line[-1]: # test only the last column writer.writerow(line) 

    Beachten Sie, dass ich in newline='' Argumente zu den open() Anrufen hinzugefügt newline='' . Das csv Modul benötigt mehr Kontrolle über Zeilenumbrüche; Dies könnte nicht zu Problemen bei Windows führen und bei der Handhabung von Werten, die Zeilenumbrüche enthalten.

    Demo:

     >>> from io import StringIO >>> import csv, sys >>> newcik = '''\ ... 66740,1800,1001463,1467373,896159 ... ''' >>> search_file = '''\ ... 1001385|NORTHWEST PIPE CO|10-Q|2015-05-06|edgar/data/1001385/0001193125-15-174814.txt ... 1001426|PERICOM SEMICONDUCTOR CORP|10-Q|2015-05-05|edgar/data/1001426/0001145443-15-000628.txt ... 1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001386.txt ... 1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001394.txt ... 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001388.txt ... 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001390.txt ... 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001392.txt ... 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001396.txt ... ''' >>> with StringIO(newcik) as reader2: ... reader2 = csv.reader(reader2) ... cik_values = next(reader2) # first row ... >>> with StringIO(search_file) as f_in: ... reader = csv.reader(f_in, delimiter='|') ... writer = csv.writer(sys.stdout, delimiter='|') ... for line in reader: ... for cik in cik_values: ... if cik in line[-1]: # test only the last column ... writer.writerow(line) ... 1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001386.txt 103 1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001394.txt 103 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001388.txt 103 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001390.txt 103 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001392.txt 103 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001396.txt 103 

    Die 103 Nummern sind die Anzahl der Bytes, die in jedem writer.writerow() Aufruf geschrieben wurden, von der REPL wiederholt.

    Python ist die beste Programmiersprache der Welt.