Как сделать индекс csv.reader() по полю / строке, а не по символу?

Я пытаюсь использовать csv.reader() для извлечения значений из базы данных для последующего сравнения. Я хочу, чтобы читатель проиндексировал строку, чтобы каждый элемент в списке соответствовал значению, разделенному запятыми, а не символу в строке.

Мой код:

with open(sys.argv[1]) as str_db:
    str_reader = csv.reader(str_db)
    line_count = 0
    fields = []
    for row in str_db:
        if line_count == 0:
            fields = re.split(",", row)
            line_count += 1
        else:
            print(f"{fields[0]}: {row[0]}, {fields[1]}: {row[1]}, {fields[2]}: {row[2]}, {fields[3]}: {row[3]}")

Извлечение из файла = argv[1]:

name,AGATC,AATG,TATC
Alice,2,8,3
Bob,4,1,5
Charlie,3,2,5

Где я ожидаю увидеть:

name: Alice, AGATC: 2, AATG: 8, TATC: 3
name: Bob, AGATC: 4, AATG: 1, TATC: 5
name: Charlie, AGATC: 3, AATG: 2, TATC: 5

Вместо этого это мой результат:

name: A, AGATC: l, AATG: i, TATC
: c
name: B, AGATC: o, AATG: b, TATC
: ,
name: C, AGATC: h, AATG: a, TATC
: r

Бонус спасибо, если вы скажете мне, почему новая строка начинается в конце TATC.

Я пытался:

with open(sys.argv[1]) as str_db:
    str_reader = csv.reader(str_db, delimiter = ',')
    line_count = 0
    fields = []
    for row in str_db:
        if line_count == 0:
            fields = re.split(",", row)
            line_count += 1
        else:
            print(f"{fields[0]}: {row[0]}, {fields[1]}: {row[1]}, {fields[2]}: {row[2]}, {fields[3]}: {row[3]}")

но изменений нет.

1 ответ

Решение

На самом деле использование ридера дает правильные результаты. Заметкаnewline='' рекомендуется для открытия файлов с csv.reader а также csv.writer:

import csv

with open('input.csv',newline='') as str_db:
    reader = csv.reader(str_db)
    fields = next(reader)
    for row in reader:
        print(f"{fields[0]}: {row[0]}, {fields[1]}: {row[1]}, {fields[2]}: {row[2]}, {fields[3]}: {row[3]}")

Выход:

name: Alice, AGATC: 2, AATG: 8, TATC: 3
name: Bob, AGATC: 4, AATG: 1, TATC: 5
name: Charlie, AGATC: 3, AATG: 2, TATC: 5

DictReader может немного помочь:

import csv

with open('input.csv') as str_db:
    reader = csv.DictReader(str_db)
    for row in reader:
        print(', '.join([f'{key}: {value}' for key,value in row.items()]))

(тот же вывод)

Другие вопросы по тегам