У меня есть два файла:
- metadata.csv: содержит идентификатор, имя поставщика, имя файла и т. Д.
- hashes.csv: содержит идентификатор, за которым следует хеш
Этот идентификатор, по сути, является своего рода внешним ключом, связывающим метаданные файла с его хешем.
Я написал этот скрипт, чтобы быстро извлечь все хэши, связанные с конкретным поставщиком. Вырубается до того, как завершит обработку hashes.csv
stored_ids = []
# this file is about 1 MB
entries = csv.reader(open(options.entries, "rb"))
for row in entries:
# row[2] is the vendor
if row[2] == options.vendor:
# row[0] is the ID
stored_ids.append(row[0])
# this file is 1 GB
hashes = open(options.hashes, "rb")
# I iteratively read the file here,
# just in case the csv module doesn't do this.
for line in hashes:
# not sure if stored_ids contains strings or ints here...
# this probably isn't the problem though
if line.split(",")[0] in stored_ids:
# if its one of the IDs we're looking for, print the file and hash to STDOUT
print "%s,%s" % (line.split(",")[2], line.split(",")[4])
hashes.close()
Этот скрипт получает около 2000 записей через hashes.csv, прежде чем он остановится. Что я делаю неправильно? Я думал, что обрабатывал это построчно.
пс. CSV-файлы - это популярный формат HashKeeper, а файлы, которые я анализирую, - это хеш-наборы NSRL. http://www.nsrl.nist.gov/Downloads.htm#converter
ОБНОВЛЕНИЕ: рабочий раствор ниже. Спасибо всем, кто прокомментировал!
entries = csv.reader(open(options.entries, "rb"))
stored_ids = dict((row[0],1) for row in entries if row[2] == options.vendor)
hashes = csv.reader(open(options.hashes, "rb"))
matches = dict((row[2], row[4]) for row in hashes if row[0] in stored_ids)
for k, v in matches.iteritems():
print "%s,%s" % (k, v)