Python: Как правильно сопоставить данные со столбцом в CSV

#python #csv

#python #csv

Вопрос:

Я пытаюсь записать набор данных в файл csv. Файл имеет заголовки, и имя заголовка автоматически увеличивается в зависимости от количества значений в выходных данных этого поля. Например, если у меня есть столбец дополнительных навыков, и в нем 17 навыков, заголовок будет выглядеть так

 Additional Skills 1   Endorsements .... Additional Skills 17   Endorsements
  

Теперь, когда я записываю данные в поле, я могу записать их правильно, если есть ровно 17 полей. Но если есть другой набор данных, который содержит, скажем, 10 полей, он записывается в 10 полях, теперь, учитывая, что после столбца «Дополнительные навыки одобрения» есть другие столбцы, например, столбец «Школа», вместо записи данных «школа» в столбец «школа» данные записываются в «Дополнительные навыки 11 одобрения»

Мой код для добавления поля столбца выглядит следующим образом:

 profile_eksills_len = 0
for profile in link_data:
    new_profile_eksills = len(profile["skillsExtended"])
    if new_profile_eksills > profile_eksills_len:
        profile_eksills_len = new_profile_eksills

for i in range(profile_eksills_len):
    profile_header.append("Additional Skills {}   Endorsements".format(i 1))
  

Код для записи CSV-файла выглядит следующим образом:

 with open("data.csv", "w") as output:
    writer = csv.writer(output, dialect='excel', delimiter='t', )
    writer.writerow(profile_header)
    # get   job title
    for profile in link_data:
        exp_data = [profile['name'], profile['info'], profile['currentJob'] ]
        for exp in profile["exp"]:
            if exp['jobDesc']:
                exp_data.append(exp['title']   ":"   exp['comp']   ":"   exp['jobDesc'])
            else:
                exp_data.append(exp['title']   ":"   exp['comp'])
        for exp in profile["extras"]:
            exp_data.append(exp['extras'])
        for edu in profile['edu']:
            exp_data.append(edu['school'])
        for skills in profile["skills"]:
            exp_data.append(skills['sets']   ":"   skills['endorsementCounts'])
        for skill in profile["skillsExtended"]:
            exp_data.append(skill['extsets']   ":"   skill['endorsedCount'])

        print(exp_data)
        # write data column wise.... 


        writer.writerow(exp_data)   
  

Я хотел бы знать, есть ли способ добиться этого?

Ответ №1:

 with open(file_name, encoding='utf-8') as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        header = next(csv_reader)
        print("header:", header)
        for row in csv_reader:
            data = dict(zip(header,row))
            print('combined dict data:', data)
  

Прочитайте заголовок, а затем используйте zip для получения списка значений

Ответ №2:

Предполагая, что вы заранее знаете все свои заголовки, наилучшим подходом было бы собрать данные вашей строки в словарях и использовать csv.DictWriter для записи в файл.

DictWriter будет автоматически обрабатывать отсутствующие поля. По умолчанию они будут заполнены пустой строкой, но вы можете указать альтернативное значение с помощью параметра restval от DictReader.

Общий код будет выглядеть следующим образом:

 fieldnames = ['heading1', 'heading2', ...]
with open("data.csv", "w") as output:
    writer = csv.DictWriter(output, fieldnames, dialect='excel', delimiter='t', )
    writer.writeheader()
    # get   job title
    for profile in link_data:
        # Build a dictionary of the fieldnames and values for the row.
        row_data = {'heading1': 'foo', 'heading2': 'bar',...}
        writer.writerow(row_data)  
  

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

1. Спасибо @snakecharmerb Я использовал другой подход, что я сделал, я сравнил длину заголовка и длину данных … затем для значения разницы я добавил значение с «None». хотелось бы знать, правильный ли это подход?

2. @himanshupatel уверен, это тоже работает. Я бы использовал DictWriter для этого, потому что я не хочу зависеть от порядка расположения столбцов и не хочу загромождать код бухгалтерией, чтобы определить, сколько нужно дополнить в каждой строке. Это важные соображения для обеспечения качества производственного кода, но для одноразового скрипта ваш подход подходит.