#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
для этого, потому что я не хочу зависеть от порядка расположения столбцов и не хочу загромождать код бухгалтерией, чтобы определить, сколько нужно дополнить в каждой строке. Это важные соображения для обеспечения качества производственного кода, но для одноразового скрипта ваш подход подходит.