Код возвращает одну и ту же строку несколько раз вместо нескольких строк - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь открыть два файла CSV и напечатать только те строки, в которых совпадает содержимое столбца в файле 1 и файле 2. Я уже знаю, что должен получить 14 результатов, но вместо этого первая строка файла CSV, с которым я работаю, печатается 14 раз. Где я ошибся?

file1 = open("../dir/file1.csv", "r")
for line in file1:
    file1splitted = line.strip().split(",")

    file2 = open("../dir/file2.csv", "r")
    for line in file2:
        file2splitted = line.strip().split(",")

        for line in file1:
            if file1splitted[0] == file2splitted [2]:
                print (file1splitted[0],file1splitted[1], file2splitted[6], file2splitted[10], file2splitted[12])

file1.close()
file2.close()

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вы должны использовать модуль csv для чтения этих файлов, потому что разделение на запятые не является надежным; хорошо, если в одном столбце CSV содержатся значения, которые сами включают запятые.

Я добавил пару вещей, чтобы попытаться сделать это чище и помочь вам продвинуться вперед в обучении:

  1. Я использовал with менеджер контекста , который автоматически закрывает файл, когда вы закончите его читать. Нет необходимости .close()
  2. Я упаковал код чтения csv в функцию. Теперь нам нужно написать эту часть только один раз, и мы можем вызвать функцию с любым файлом.
  3. Я использовал модуль csv для чтения файла. Это вернет вложенный список строк, каждый внутренний список представляет одну строку.
  4. Я использовал понимание списка , которое представляет собой более аккуратный способ написания цикла for, который создает список. В данном случае это список всех элементов в первом столбце file_1.
  5. Я преобразовал список в пункте 4 в set . Когда мы выполняем итерацию по файлу file_2, мы можем очень быстро проверить, было ли видно значение строки в file_1 (set lookup равен O (1), вместо того, чтобы выполнять итерации по file_1 каждый раз).

Индексы, которые я печатаю, взяты из моих собственных тестовых файлов, вам нужно будет адаптировать их к вашему собственному сценарию использования.

import csv

def read_csv(file_name):
    with open(file_name) as infile: # Context manager to auto-close files at end
        reader = csv.reader(infile)
        #next(reader) remove the hash if you want to drop the headers
        return list(reader)


file_1 = read_csv('file_1.csv')
file_2 = read_csv('file_2.csv')

# Make a set of file_1 column 0 with a list comprehension
file_1_vals = set([item[0] for item in file_1])

# Now iterate through file_2
for row in file_2:
    if row[2] in file_1_vals:
        print(row[1])
0 голосов
/ 26 января 2019
file1 = open("../dir/file1.csv", "r")
file2 = open("../dir/file2.csv", "r")
for line in file1:
    file1splitted = line.strip().split(",")
    for line in file2:
        file2splitted = line.strip().split(",")
        if file1splitted[0] == file2splitted [2]:
            print (file1splitted[0],file1splitted[1], file2splitted[6], file2splitted[10], file2splitted[12])

file1.close()
file2.close()

если вы предоставите свои CSV-файлы, тогда я могу помочь вам больше.

...