Ich versuche, ein paar Wörterbücher in einer CSV-Datei zu analysieren, wobei ich zwei Listen in separaten TXT-Dateien verwende, damit das Skript weiß, wonach es sucht. Die Idee ist, eine Zeile in der CSV-Datei zu finden, die sowohl mit Word als auch mit IDNumber übereinstimmt, und dann eine dritte Variable herauszuziehen, wenn eine Übereinstimmung vorliegt. Der Code läuft jedoch sehr langsam. Irgendwelche Ideen, wie ich es effizienter machen könnte?

import csv

IDNumberList_filename = 'IDs.txt'
WordsOfInterest_filename = 'dictionary_WordsOfInterest.txt'
Dictionary_filename = 'dictionary_individualwords.csv'

WordsOfInterest_ReadIn = open(WordsOfInterest_filename).read().split('\n')
#IDNumberListtoRead = open(IDNumberList_filename).read().split('\n')

for CurrentIDNumber in open(IDNumberList_filename).readlines():
    for CurrentWord in open(WordsOfInterest_filename).readlines():
        FoundCurrent = 0

        with open(Dictionary_filename, newline='', encoding='utf-8') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                if ((row['IDNumber'] == CurrentIDNumber) and (row['Word'] == CurrentWord)):
                    FoundCurrent = 1
                    CurrentProportion= row['CurrentProportion']

            if FoundCurrent == 0:
                CurrentProportion=0
            else:
                CurrentProportion=1
                print('found')
0
SimonSchus 14 Aug. 2015 im 15:58

3 Antworten

Beste Antwort

Sie öffnen die CSV-Datei N mal wo N = (# lines in IDS.txt) * (# lines in dictionary_WordsOfInterest.txt). Wenn die Datei nicht zu groß ist, können Sie dies vermeiden, indem Sie ihren Inhalt unter Wörterbuch oder ein Liste der Listen.

Auf die gleiche Weise öffnen Sie dictionary_WordsOfInterest.txt jedes Mal, wenn Sie eine neue Zeile aus IDS.txt lesen.

Es scheint auch, dass Sie nach einer beliebigen Kombination von Paaren (CurrentIDNumber, CurrentWord) suchen, die aus den txt-Dateien möglich ist. So können Sie beispielsweise die IDs in einem Satz und die Wörter in einem anderen Satz speichern und für jede Zeile in der CSV-Datei überprüfen, ob sich sowohl die ID als auch das Wort in ihrem jeweiligen Satz befinden.

1
Community 23 Mai 2017 im 10:28

Zunächst sollten Sie die Datei dictionary_individualwords.csv in den Speicher laden. Ich denke, dass das Python-Wörterbuch die richtige Datenstruktur für diesen Fall ist.

2
Dmitriy Sorochenkov 14 Aug. 2015 im 13:19

Wenn Sie Readlines für die TXT-Dateien verwenden, erstellen Sie bereits eine In-Memory-Liste mit diesen. Sie sollten diese Listen zuerst erstellen und sie erst einmal die CSV-Datei analysieren. Etwas wie:

import csv

IDNumberList_filename = 'IDs.txt'
WordsOfInterest_filename = 'dictionary_WordsOfInterest.txt'
Dictionary_filename = 'dictionary_individualwords.csv'

WordsOfInterest_ReadIn = open(WordsOfInterest_filename).read().split('\n')
#IDNumberListtoRead = open(IDNumberList_filename).read().split('\n')

numberlist = open(IDNumberList_filename).readlines():
wordlist =  open(WordsOfInterest_filename).readlines():

FoundCurrent = 0

with open(Dictionary_filename, newline='', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        for CurrentIDNumber in numberlist:
            for CurrentWord in wordlist :

                if ((row['IDNumber'] == CurrentIDNumber) and (row['Word'] == CurrentWord)):
                    FoundCurrent = 1
                    CurrentProportion= row['CurrentProportion']

                if FoundCurrent == 0:
                    CurrentProportion=0
                else:
                    CurrentProportion=1
                    print('found')

Achtung: ungetestet

1
Serge Ballesta 14 Aug. 2015 im 13:27