Неправильное отображение csv файла в excel
После импорта данных в excel неправильно отображается файл.
Вот из excel. Тут два продукта. Они Должны быть на отдельной строчке, а не через колонку.:
Вот часть кода:
for item in result_three:
done = []
for i in item:
element = i.split('\n')
try:
element = f'{element[0]} {element[1]}, {element[2]};'
done.append(element)
except:
element = f'{element[0]} {element[1]}, {element[1]};'
done.append(element)
result_four.append(done)
Вот как выглядят данные на выходе:
['Тип кузова - Компактный кроссовер, Компактный кроссовер;Количество дверей - 5, 5;Количество мест - 5, 5;Дорожный просвет - 170 мм, 170 мм;Объем багажника - 455-1200 л, 455-1200 л;', 'Длина - 4200 мм, 4200 мм;Ширина - 1790 мм, 1790 мм;Высота - 1600 мм, 1600 мм;Колесная база - 2570 мм, 2570 мм;Колея передних колес - 1540 мм, 1540 мм;Колея задних колес - 1530 мм, 1530 мм;Радиус разворота - 5 м, 5 м;', 'Расстояние от подушки переднего сиденья до потолка - 960 мм, 960 мм;Расстояние от подушки заднего сиденья до потолка - 974 мм, 974 мм;Ширина салона для первого ряда - 1400 мм, 1400 мм;Ширина салона для второго ряда сидений - 1385 мм, 1385 мм;Ширина салона спереди на уровне плеч - 1382 мм, 1382 мм;Ширина салона сзади на уровне плеч - 1340 мм, 1340 мм;Пространство для ног передних пассажиров - 1020 мм, 1020 мм;Пространство для ног задних пассажиров - 918 мм, 918 мм;', 'Тип - Бензиновый, Бензиновый;Экологический класс - ЕВРО 5, ЕВРО 5;Объем - 1498 см3, 1498 см3;Максимальная мощность - 107 л.с. (79 кВт) при 6000 об/мин, 107 л.с. (79 кВт) при 6000 об/мин;Максимальный крутящий момент - 142 Н•м при 4000 об/мин, 142 Н•м при 4000 об/мин;Расположение двигателя - Переднее поперечное, Переднее поперечное;Конструкция - С водяным охлаждением, рядный, С водяным охлаждением, рядный;Число цилиндров - 4, 4;Число клапанов - 16, 16;Газораспределительный механизм - VVT, VVT;Степень сжатия - 10, 10;', 'Тип - Механическая КПП, ручное управление, Автоматическая КПП, гидромеханическая;Количество передач - 5, 5;', 'Разгон 0-100 км/ч - 11.4 с, 11.4 с;Максимальная скорость - 170 км/ч, 160 км/ч;', 'Загородный цикл - 6.3 л, 6.5 л;Смешанный цикл - 7.5 л, 7.5 л;Объем топливного бака - 52 л, 52 л;', 'Тип привода - Передний, Передний;Рулевой механизм - Шестерня-рейка, Шестерня-рейка;Рулевое управление - Электроусилитель, Электроусилитель;Тормоза передние - Дисковые, Дисковые;Тормоза задние - Дисковые, Дисковые;Подвеска передняя - Независимая, пружинная, типа МакФерсон, со стабилизатором поперечной устойчивости, Независимая, пружинная, типа МакФерсон, со стабилизатором поперечной устойчивости;Подвеска задняя - Полузависимая, рычажная, пружинная, с гидравлическими, телескопическими амортизаторами, Полузависимая, рычажная, пружинная, с гидравлическими, телескопическими амортизаторами;', 'Снаряженная масса - 1400 кг, 1425 кг;Максимальная полная масса - 1715 кг, 1740 кг;', 'Размерность шин - 215/60 R17, 215/60 R17;Диски - Легкосплавные, алюминиевые, Легкосплавные, алюминиевые;Запасное колесо - Докатка (Т155/90 R16), Докатка (Т155/90 R16);']
Или так:
Вот как записывается в csv:
def write_to_csv(self, data):
""" Добавляем данные """
with open('data.csv', 'a', newline='') as file:
writer = csv.writer(file)
writer.writerow((
data[0],
data[1],
data[2],
data[3],
data[4],
data[5],
data[6],
data[7],
data[8],
data[9],
))
Пробовал изменять код на так:
for item in result_three:
done = []
for i in item:
element = i.split('\n')
try:
element = f'{element[0]} {element[1]}, {element[2]};\n' # Здесь \n
done.append(element)
except:
element = f'{element[0]} {element[1]}, {element[1]};\n' # И здесь \n
done.append(element)
result_four.append(done)
Также пробовал указывать разделитель на точку с запятой, но все получается в одну строчку и разделитель через колонку.
Изменил код здесь:
for item in result_three:
done = []
for i in item:
element = i.split('\n')
try:
element = f'{element[0]} {element[1]}, {element[2]}\t' # Поставил \t
done.append(element)
except:
element = f'{element[0]} {element[1]}, {element[1]}\t' # Поставил \t
done.append(element)
result_four.append(done)
return result_four
И теперь отображается все в одну строчку:

Ответы (2 шт):
Нужно или добавлять разделитель вручную, и писать напрямую в файл вручную без модуля csv, или использовать модуль csv без ручного добавления разделителя. Совмещать оба подхода я не рекомендую, вы так только запутаетесь.
Если вы уже добавили разделитель:
data = [
"Тип кузова - Компактный кроссовер, Компактный кроссовер;Количество дверей - 5, 5;Количество мест - 5, 5;Дорожный просвет - 170 мм, 170 мм;Объем багажника - 455-1200 л, 455-1200 л;",
"Длина - 4200 мм, 4200 мм;Ширина - 1790 мм, 1790 мм;Высота - 1600 мм, 1600 мм;Колесная база - 2570 мм, 2570 мм;Колея передних колес - 1540 мм, 1540 мм;Колея задних колес - 1530 мм, 1530 мм;Радиус разворота - 5 м, 5 м;",
"Расстояние от подушки переднего сиденья до потолка - 960 мм, 960 мм;Расстояние от подушки заднего сиденья до потолка - 974 мм, 974 мм;Ширина салона для первого ряда - 1400 мм, 1400 мм;Ширина салона для второго ряда сидений - 1385 мм, 1385 мм;Ширина салона спереди на уровне плеч - 1382 мм, 1382 мм;Ширина салона сзади на уровне плеч - 1340 мм, 1340 мм;Пространство для ног передних пассажиров - 1020 мм, 1020 мм;Пространство для ног задних пассажиров - 918 мм, 918 мм;",
"Тип - Бензиновый, Бензиновый;Экологический класс - ЕВРО 5, ЕВРО 5;Объем - 1498 см3, 1498 см3;Максимальная мощность - 107 л.с. (79 кВт) при 6000 об/мин, 107 л.с. (79 кВт) при 6000 об/мин;Максимальный крутящий момент - 142 Н•м при 4000 об/мин, 142 Н•м при 4000 об/мин;Расположение двигателя - Переднее поперечное, Переднее поперечное;Конструкция - С водяным охлаждением, рядный, С водяным охлаждением, рядный;Число цилиндров - 4, 4;Число клапанов - 16, 16;Газораспределительный механизм - VVT, VVT;Степень сжатия - 10, 10;",
"Тип - Механическая КПП, ручное управление, Автоматическая КПП, гидромеханическая;Количество передач - 5, 5;",
"Разгон 0-100 км/ч - 11.4 с, 11.4 с;Максимальная скорость - 170 км/ч, 160 км/ч;",
"Загородный цикл - 6.3 л, 6.5 л;Смешанный цикл - 7.5 л, 7.5 л;Объем топливного бака - 52 л, 52 л;",
"Тип привода - Передний, Передний;Рулевой механизм - Шестерня-рейка, Шестерня-рейка;Рулевое управление - Электроусилитель, Электроусилитель;Тормоза передние - Дисковые, Дисковые;Тормоза задние - Дисковые, Дисковые;Подвеска передняя - Независимая, пружинная, типа МакФерсон, со стабилизатором поперечной устойчивости, Независимая, пружинная, типа МакФерсон, со стабилизатором поперечной устойчивости;Подвеска задняя - Полузависимая, рычажная, пружинная, с гидравлическими, телескопическими амортизаторами, Полузависимая, рычажная, пружинная, с гидравлическими, телескопическими амортизаторами;",
"Снаряженная масса - 1400 кг, 1425 кг;Максимальная полная масса - 1715 кг, 1740 кг;",
"Размерность шин - 215/60 R17, 215/60 R17;Диски - Легкосплавные, алюминиевые, Легкосплавные, алюминиевые;Запасное колесо - Докатка (Т155/90 R16), Докатка (Т155/90 R16);",
]
with open("file.csv", "w") as file:
for line in data:
file.write(line)
file.write('\n') # В строках переноса строки нет, поэтому нужно добавить его вручную
# Или вместо двух file.write сделать print(line, file=file) - перенос строки будет добавлен автоматически
Каждый элемент исходного списка для excel будет отдельной строкой таблицы, каждый кусок строки между разделителями (точкой с запятой) - отдельной ячейкой.
Пример использования модуля csv (тут не нужно добавлять вручную никакие разделители, переносы строк, и т.д.):
data = [
[
"Тип кузова - Компактный кроссовер, Компактный кроссовер",
"Количество дверей - 5, 5",
"Количество мест - 5, 5",
"Дорожный просвет - 170 мм, 170 мм",
"Объем багажника - 455-1200 л, 455-1200 л",
],
[
"Длина - 4200 мм, 4200 мм",
"Ширина - 1790 мм, 1790 мм",
"Высота - 1600 мм, 1600 мм",
"Колесная база - 2570 мм, 2570 мм",
"Колея передних колес - 1540 мм, 1540 мм",
"Колея задних колес - 1530 мм, 1530 мм",
"Радиус разворота - 5 м, 5 м",
],
]
import csv
with open("file.csv", "w", newline='') as file:
writer = csv.writer(file, delimiter=';') # разделитель указывается в параметрах writer-а
writer.writerows(data)
Результат:
Каждый подсписок в списке data для excel будет отдельной строкой таблицы, каждый элемент подсписка - отдельной ячейкой.
Если нужно, чтобы у вас два продукта были на двух строках, то нужно создать список из двух подсписков, в каждом из подсписков все данные по продуктам.
Написал комментарий, пока ответа нет напишу свое виденье решения проблемы.
- Данные странные не много, поэтому хочется их почистить:
from collections import OrderedDict
data = ['Тип кузова - Компактный кроссовер, Компактный кроссовер;Количество дверей - 5, 5;Количество мест - 5, 5;Дорожный просвет - 170 мм, 170 мм;Объем багажника - 455-1200 л, 455-1200 л;', 'Длина - 4200 мм, 4200 мм;Ширина - 1790 мм, 1790 мм;Высота - 1600 мм, 1600 мм;Колесная база - 2570 мм, 2570 мм;Колея передних колес - 1540 мм, 1540 мм;Колея задних колес - 1530 мм, 1530 мм;Радиус разворота - 5 м, 5 м;', 'Расстояние от подушки переднего сиденья до потолка - 960 мм, 960 мм;Расстояние от подушки заднего сиденья до потолка - 974 мм, 974 мм;Ширина салона для первого ряда - 1400 мм, 1400 мм;Ширина салона для второго ряда сидений - 1385 мм, 1385 мм;Ширина салона спереди на уровне плеч - 1382 мм, 1382 мм;Ширина салона сзади на уровне плеч - 1340 мм, 1340 мм;Пространство для ног передних пассажиров - 1020 мм, 1020 мм;Пространство для ног задних пассажиров - 918 мм, 918 мм;', 'Тип - Бензиновый, Бензиновый;Экологический класс - ЕВРО 5, ЕВРО 5;Объем - 1498 см3, 1498 см3;Максимальная мощность - 107 л.с. (79 кВт) при 6000 об/мин, 107 л.с. (79 кВт) при 6000 об/мин;Максимальный крутящий момент - 142 Н•м при 4000 об/мин, 142 Н•м при 4000 об/мин;Расположение двигателя - Переднее поперечное, Переднее поперечное;Конструкция - С водяным охлаждением, рядный, С водяным охлаждением, рядный;Число цилиндров - 4, 4;Число клапанов - 16, 16;Газораспределительный механизм - VVT, VVT;Степень сжатия - 10, 10;', 'Тип - Механическая КПП, ручное управление, Автоматическая КПП, гидромеханическая;Количество передач - 5, 5;', 'Разгон 0-100 км/ч - 11.4 с, 11.4 с;Максимальная скорость - 170 км/ч, 160 км/ч;', 'Загородный цикл - 6.3 л, 6.5 л;Смешанный цикл - 7.5 л, 7.5 л;Объем топливного бака - 52 л, 52 л;', 'Тип привода - Передний, Передний;Рулевой механизм - Шестерня-рейка, Шестерня-рейка;Рулевое управление - Электроусилитель, Электроусилитель;Тормоза передние - Дисковые, Дисковые;Тормоза задние - Дисковые, Дисковые;Подвеска передняя - Независимая, пружинная, типа МакФерсон, со стабилизатором поперечной устойчивости, Независимая, пружинная, типа МакФерсон, со стабилизатором поперечной устойчивости;Подвеска задняя - Полузависимая, рычажная, пружинная, с гидравлическими, телескопическими амортизаторами, Полузависимая, рычажная, пружинная, с гидравлическими, телескопическими амортизаторами;', 'Снаряженная масса - 1400 кг, 1425 кг;Максимальная полная масса - 1715 кг, 1740 кг;', 'Размерность шин - 215/60 R17, 215/60 R17;Диски - Легкосплавные, алюминиевые, Легкосплавные, алюминиевые;Запасное колесо - Докатка (Т155/90 R16), Докатка (Т155/90 R16);']
data = ''join(data)
# Внес правку для того что бы ключи сохранялись всегда в одном порядке, спасибо за замечание @insolor
data = OrderedDict( [
(x.split('-')[0].strip(), x.split('-')[1].strip().split(',')[0]) # Делим каждую строку на 2 подстроки (1- ключ, 2-значение)
for x in data.split(';') # Разделили строку на список строк по ";"
if x ] ) # есть пустые строки - их пропускаем
Теперь данные выглядят так:
data = {'Тип кузова': 'Компактный кроссовер', 'Количество дверей': '5', 'Количество мест': '5', ...}
Для удобства работы со словарями в библиотеке для работы с csv есть класс DictWriter. Для начала определим какие у нас поля (названия столбцов):
fieldnames = list(data.keys())
Далее приступим к записи:
with open("result.csv", 'w+', encoding="1251", newline='') as fl:
writer = csv.DictWriter(fl, fieldnames=fieldnames, delimiter=';')
writer.writeheader() # Запись название столбцов
writer.writerow(data) # Запись данных




