Python редактирует определенную строку и столбец csv-файла

#python-3.x #csv

#python-3.x #csv

Вопрос:

Здесь у меня есть некоторый код на Python, предназначенный для того, чтобы использовать пользовательский ввод для целевой настройки определенной строки CSV, а затем перезаписать ее, если определенная буква совпадает.

 import csv

line_count = 0
marked_item = int(input("Enter the item number:"))
with open("items.csv", 'r') as f:
    reader = csv.reader(f, delimiter=',')
    title = next(reader)
    print(title)
    print(title[3])
    lines = []
    for line in reader:
        if title[3] == 'a':
            line_count  = 1
            if marked_item == line_count:
                title[3] = 'b'
        lines.append(line)
with open("items.csv", 'w', newline='') as f:
    writer = csv.writer(f, delimiter=',')
    writer.writerow(title)
    writer.writerows(lines)
  

Этот код работает почти так, как я хочу, но он не может редактировать любую другую строку, кроме первой. примером вывода этого кода является:

 red,12.95,2,b #note, this change from 'a' to 'b'
blue,42.5,3,a #How can I target this row and change it?
green,40.0,1,a
  

проблема, с которой я сталкиваюсь, заключается в том, что она нацелена на другую строку, такую как строка ‘blue, 42.5, a’. Мой код не может настроить таргетинг, а затем изменить значение ‘a’ на ‘b’.

Ответ №1:

вы повторяете line и меняетесь title . Сделайте это:

 for line in reader:
    if len(line)>3 and line[3] == 'a':
        line_count  = 1
        if marked_item == line_count:
            line[3] = 'b'
    lines.append(line)
  

и удалите title = next(reader) , поскольку у вас нет заголовка.

полный исправленный код для входных CSV-файлов, у которых нет строки заголовка:

 import csv

line_count = 0
marked_item = int(input("Enter the item number:"))
with open("items.csv", 'r') as f:
    reader = csv.reader(f, delimiter=',')

    lines = []
    for line in reader:
        if len(line)>3 and line[3] == 'a':
            line_count  = 1
            if marked_item == line_count:
                line[3] = 'b'
        lines.append(line)
with open("items.csv", 'w', newline='') as f:
    writer = csv.writer(f, delimiter=',')
    writer.writerow(title)
    writer.writerows(lines)
  

Комментарии:

1. Я пытался сделать это изначально, но я получаю эту ошибку: ‘если строка [3] == ‘r’: IndexError: индекс списка вне диапазона’

2. обратите внимание, что ‘r’ в строке ‘if[3] == ‘r’ ‘. Я изменил свой код, чтобы отразить ‘r’ вместо ‘a’

3. У вас должны быть пустые строки. Я добавил проверку длины в строке.

4. на самом деле, я только что попробовал верхний код, который вы туда вставили. теперь это работает, большое вам спасибо