Проверка суффикса элементов в списке - PullRequest
1 голос
/ 31 марта 2020

Мне нужно создать новый столбец в CSV-файле, глядя на суффикс элементов в первом столбце («Тема»). В частности, если элемент первого столбца заканчивается на _pol, тогда мне нужно добавить «politics» к соответствующей строке в новом столбце; если оно заканчивается на _sport, тогда я добавляю "sports"; если оно заканчивается на _econ, тогда я добавляю "economics"; и так далее.

Элементы в первом столбце выглядят так:

subject_pol
subj_econ
homework_sport
...

Я хотел бы сравнить конечные элементы с суффиксом в списке:

suffix= ['_pol','_econ','_sport','_maths','_computerscience', 'others']

для присвоения соответствующего поля:

   field=['politics', 'economics', 'sports','mathematics','computer science', 'others']

Я написал следующий код, но он не проверяет, заканчивается ли элемент значением из списка выше.

with open('/parsed.csv','r') as csvinput:
    with open('/parsed_out.csv', 'w') as csvoutput:
        writer = csv.writer(csvoutput, lineterminator='\n')
        reader = csv.reader(csvinput)

        all = []
        row = next(reader)
        row.append('Subjects')
        all.append(row)

        for row in reader: 
            if [row[0].endswith(i) for i in suffix]:
                row.append(fields) #WRONG

        writer.writerows(all)

Приведенный выше код просто добавляет новые столбцы в файл (out): я знаю, что что-то не так в for l oop, когда я проверяю суффикс.

Не могли бы вы помочь мне правильно исправить код и объяснить, как проверить значения?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вы можете использовать встроенную функцию zip(), чтобы создать последовательность пар суффикса и поля, которые можно использовать для проверки соответствия суффикса и определения соответствующего поля для добавления. Также нет причин сначала создавать все строки, а затем выводить их, потому что обработку можно выполнять постепенно, построчно.

Вот что я имею в виду:

import csv

UNKNOWN = 'UNKNOWN'
suffixes = ['_pol', '_econ', '_sport', '_maths', '_computerscience', 'others']
fields = ['politics', 'economics', 'sports', 'mathematics', 'computer science', 'others']
pairs = tuple(zip(suffixes, fields))

with open('./parsed.csv', 'r', newline='') as csvinput, \
     open('./parsed_out.csv', 'w', newline='') as csvoutput:

    reader = csv.reader(csvinput)
    writer = csv.writer(csvoutput, lineterminator='\n')

    header = next(reader)
    header.append('Subjects')
    writer.writerow(header)

    for row in reader:
        match = [UNKNOWN]
        for suffix, field in pairs:
            if row[0].endswith(suffix):
                match[0] = field
                break
        writer.writerow(row + match)

print('Done')
1 голос
/ 31 марта 2020

Вы можете сделать что-то вроде

for row in reader:
    field = None
    for (s,f) in zip(suffix, fields):
        if row[0].endswith(s):
            field = f
            break
...