Изменение последнего элемента списка также перезаписывает предпоследний элемент.

У меня есть csv-файл следующей структуры:

1 start,end,ID
2 int1,int2,string1
3 int3,int4,string2
4 int5,int6,string3
5 int7,int8,string4

Моя цель - создать новый csv, который записывает уникальную строку, во-первых, для конечного значения, а во-вторых, для начального значения в качестве конечного значения.

1 start,end,ID
2 int1,int2,string1
3 ,int1,string1
4 int3,int4,string2
5 ,int3,string2

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

import csv

with open(r"input path") as csv_sbw, open("output path","wb") as csv_new:
    csv_in = csv.reader(csv_sbw)
    csv_out = csv.writer(csv_new)
    fields_out = [[]] #list for the output csv
    fields = list(csv_in) #list for the input csv
    fields_out[0] = fields[0] #headline is taken from the input
    fields[0].append("m_value")
    for row in fields[1:]:
        row.append(1)
        if row[2].isdigit() == False and len(row[2]) == 16 and row[2][0] != 0 and row[0] != '' and row[0] != '0' and row[1] != '0': #invalid rows are skipped
            fields_out.append(row) #first row is appended
            fields_out.append(row) #second row is appended
            fields_out[-1][1] = row[0] #the start value of the last appended row is set as an end value
            fields_out[-1][0] = '' #start field of last appended row is deleted
            fields_out[-1][3] = 0
    csv_out.writerows(fields_out) #output csv is written

Вместо создания csv по примеру, описанному выше, я получаю следующий результат:

1 start,end,ID,m_value
2 1032,1032,'A',0
3 1032,1032,'A',0
4 613,613,'B',0
5 613,613,'B',0

Таким образом, при изменении fields[-1] код, похоже, также перезаписывает предпоследнюю добавленную строку. Насколько я понимаю, добавление двух значений подряд в список создает два новых элемента списка, из которых будет возвращено только последнее добавленное значение, если я запрошу list[-1]. Как предотвратить перезапись кодом обеих добавленных строк и вместо этого разрешить перезаписывать только последнюю добавленную строку?


person j01i147    schedule 14.08.2020    source источник
comment
Чтобы уточнить, пример желаемого вывода CSV неполный, верно? Я думаю, вместо 5 рядов должно быть 9 рядов.   -  person Ben    schedule 14.08.2020


Ответы (1)


Чтобы еще раз сформулировать вашу цель, приведенный ниже фрагмент кода создает новый CSV-файл, который

  1. записывает строку для исходной строки и,
  2. записывает строку с начальным значением и строкой.

Если эта оценка верна, я обычно открываю один файл за раз, чтобы свести к минимуму свою когнитивную нагрузку.

with open('input.csv','r') as file_handle:
    file_content = file_handle.read().split('\n')
with open('output.csv','r') as file_handle:
    for index,line in enumerate(file_content):
        if index==0:
            print(line)
            file_handle.write(line)
        else:
            line_as_list = line.split(',')
            print(line_as_list)
            file_handle.write(line)
            print(line_as_list[0], line_as_list[-1])
            file_handle.write(str(line_as_list[0])+","+str(line_as_list[-1]))
person Ben    schedule 14.08.2020