You need to create a csv file with Header.

When adding a new product, if it has a header in the dictionary, which is not in csv, then you need to add this header to csv, and all products that were left before adding leave this place empty.

How can this be implemented? Perhaps you can first store it in a temporary structure, and only in the last step, save it to csv.

Before that, I only created csv with a fixed number of columns, but never worked with dynamic ones.

Example:

{'NAME': 'AquaDoctor C-60 50 ΠΊΠ³. Π² Π³Ρ€Π°Π½ΡƒΠ»Π°Ρ…', 'PRICE': '17\xa0919,00', 'STOCK_STATUS': False, 'SKU': '1551', 'CATEGORY_ID': 28, 'IMAGE': 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/c/6/c60_5_1.jpg', 'IMAGES': [], 'MANUFACTURER': 'AquaDoctor', 'COUNTRY_OF_ORIGIN': 'ΠšΠΈΡ‚Π°ΠΉ', 'DESCRIPTION': 'Π£Π΄Π°Ρ€Π½Ρ‹ΠΉ, быстрорастворимый ΠΏΡ€Π΅ΠΏΠ°Ρ€Π°Ρ‚ содСрТащий 60% Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ…Π»ΠΎΡ€Π°. ΠŸΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ΡΡ Π² Π³Ρ€Π°Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ (шоковой) ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΎΠ΄Ρ‹ Π² бассСйнС. Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ вирусы, Π±Π°ΠΊΡ‚Π΅Ρ€ΠΈΠΈ, Π³Ρ€ΠΈΠ±ΠΎΠΊ, плСсСнь.', 'DESCRIPTION_FEATURE': ''}, {'CATEGORY_ID': 11, 'IMAGE': 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_heat_exchanger_1_2.jpg', 'IMAGES': ['https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_combine-2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_heat_exchange_5_2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/e/l/elec_g2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/h/e/heat-exchanger-horizontal_s-2.png', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/f/i/file_42_2.jpg'], 'ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ': '30 ΠΊΠ’Ρ‚', 'Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ': '<ul class="bullet"><li>ΠšΠΎΡ€ΠΏΡƒΡ ΠΈΠ· Π½Π΅Ρ€ΠΆΠ°Π²Π΅ΡŽΡ‰Π΅ΠΉ стали BS 316L (EN 1.4432)</li><li>Π’Ρ€ΡƒΠ±ΠΊΠΈ ΠΈΠ· Ρ‚ΠΈΡ‚Π°Π½Π°</li><li>МаксимальноС Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ 4 Π‘Π°Ρ€</li><li>Π’Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π½Ρ‹Π΅ ограничСния ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° Ρ‚Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠ° G2: 90 ℃</li><li>Полиамидная Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠ°</li><li>ΠšΠ°ΠΌΠ΅Ρ€Π° с тСплоизоляциСй</li><li>Π€ΠΈΡ‚ΠΈΠ½Π³ΠΈ ΠΈΠ· Π»Π°Ρ‚ΡƒΠ½ΠΈ ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΈΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ состава</li><li>Высокая ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Ρ‚Π΅ΠΏΠ»ΠΎΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ</li><li>Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΈ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ΠΎΠ² контроля</li></ul>', 'ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΡ': '<ul class="bullet"><li>Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30T</li><li>Π›Π°Ρ‚ΡƒΠ½Π½Ρ‹Π΅ Ρ„ΠΈΡ‚ΠΈΠ½Π³ΠΈ для ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°</li><li>Π’ΠΈΡ‚Π°Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Ρ€ΠΌΠ°Π½ для тСрмостата</li><li>ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»Π°ΠΏΠ°Π½</li><li>Π€ΠΈΡ‚ΠΈΠ½Π³ΠΈ соСдинСния, Π·Π°Π³Π»ΡƒΡˆΠΊΠ°, ΠΏΡ€ΠΎΠΊΠ»Π°Π΄ΠΊΠ°</li><li>ΠšΡ€Π΅ΠΏΠ΅ΠΆΠ½Π°Ρ скоба</li><li>Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ</li></ul>', 'ВСс, ΠΊΠ³': '2', 'MANUFACTURER': 'Elecro', 'Гарантия': '12 мСсяцСв', 'COUNTRY_OF_ORIGIN': 'ВСликобритания', 'DESCRIPTION': 'Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 для ΠΎΠ±ΠΎΠ³Ρ€Π΅Π²Π° бассСйнов. Π˜ΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΈΠ· Π½Π΅Ρ€ΠΆΠ°Π²Π΅ΡŽΡ‰Π΅ΠΉ стали, Ρ‚ΠΈΡ‚Π°Π½Π°, ΠΏΠΎΠ»ΠΈΠΌΠ΅Ρ€Π° ΠΈ Π»Π°Ρ‚ΡƒΠ½ΠΈ. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π΅Π²Π·ΠΎΠΉΠ΄Π΅Π½Π½ΠΎ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Ρ‚Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π° с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ тСплопотСрями. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для примСнСния с Π³Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΎΠΏΠ»ΠΈΠ²Π½Ρ‹ΠΌΠΈ Π±ΠΎΠΉΠ»Π΅Ρ€Π°ΠΌΠΈ, солнСчными панСлями ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚Π΅ΠΏΠ»ΠΎΠ²Ρ‹ΠΌΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°ΠΌΠΈ.', 'DESCRIPTION_FEATURE': '<li>ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ: 30 ΠΊΠ’Ρ‚</li><li>Π’Ρ€ΡƒΠ±ΠΊΠΈ: Ρ‚ΠΈΡ‚Π°Π½</li><li>ΠšΠΎΡ€ΠΏΡƒΡ: Π½Π΅Ρ€ΠΆ. ΡΡ‚Π°Π»ΡŒ 316</li><li>ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€: 1"</li><li>Π’Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€: 1.5"</li>', 'NAME': 'Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30 ΠΊΠ’Ρ‚ (titanium)', 'PRICE': '23\xa0381,00', 'SKU': '6973'} 

As you can see, they have a different number of fields.

Example csv, how it should look like:

 CATEGORY_ID;NAME; PRICE; SKU; DESCRIPTION; MANUFACTURER; 'ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ'; ..; 100;AquaDoctor C-60;1709,19;1551;Π£Π΄Π°Ρ€Π½Ρ‹ΠΉ, быстро..;'AquaDoctor';'30 ΠΊΠ’Ρ‚' .. 2;Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ El;23081,00;6973;Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ ..;'Elecro'; ; 

; The first line is the title of the headings, if a property appears which is not in the heading, it is added there.

Missing properties of products must leave empty space.

  • What should this CSV look like? It is better to store such data in JSON ... - MaxU
  • @MaxU 1 row column names, - danilshik
  • The remaining lines, the product parameters - danilshik
  • But you just need to save in csv - danilshik
  • one
    Of course, if they give you an answer in which there will be three dots instead of a specific code, will this be your answer? What will the values ​​in the IMAGES column look like? It seems that you are not interested in receiving a response. I advise you to read: How to most effectively ask a question about Pandas / Numpy / SciPy / SciKit Learn / SQL / etc.? - MaxU pm

2 answers 2

Solution using the Pandas module:

 import pandas as pd # pip install pandas data = [{'NAME': 'AquaDoctor C-60 50 ΠΊΠ³. Π² Π³Ρ€Π°Π½ΡƒΠ»Π°Ρ…', 'PRICE': '17\xa0919,00', 'STOCK_STATUS': False, 'SKU': '1551', 'CATEGORY_ID': 28, 'IMAGE': 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/c/6/c60_5_1.jpg', 'IMAGES': [], 'MANUFACTURER': 'AquaDoctor', 'COUNTRY_OF_ORIGIN': 'ΠšΠΈΡ‚Π°ΠΉ', 'DESCRIPTION': 'Π£Π΄Π°Ρ€Π½Ρ‹ΠΉ, быстрорастворимый ΠΏΡ€Π΅ΠΏΠ°Ρ€Π°Ρ‚ содСрТащий 60% Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ…Π»ΠΎΡ€Π°. ΠŸΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ΡΡ Π² Π³Ρ€Π°Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ (шоковой) ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΎΠ΄Ρ‹ Π² бассСйнС. Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ вирусы, Π±Π°ΠΊΡ‚Π΅Ρ€ΠΈΠΈ, Π³Ρ€ΠΈΠ±ΠΎΠΊ, плСсСнь.', 'DESCRIPTION_FEATURE': ''}, {'CATEGORY_ID': 11, 'IMAGE': 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_heat_exchanger_1_2.jpg', 'IMAGES': ['https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_combine-2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_heat_exchange_5_2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/e/l/elec_g2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/h/e/heat-exchanger-horizontal_s-2.png', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/f/i/file_42_2.jpg'], 'ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ': '30 ΠΊΠ’Ρ‚', 'Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ': '<ul class="bullet"><li>ΠšΠΎΡ€ΠΏΡƒΡ ΠΈΠ· Π½Π΅Ρ€ΠΆΠ°Π²Π΅ΡŽΡ‰Π΅ΠΉ стали BS 316L (EN 1.4432)</li><li>Π’Ρ€ΡƒΠ±ΠΊΠΈ ΠΈΠ· Ρ‚ΠΈΡ‚Π°Π½Π°</li><li>МаксимальноС Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ 4 Π‘Π°Ρ€</li><li>Π’Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π½Ρ‹Π΅ ограничСния ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° Ρ‚Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠ° G2: 90 ?</li><li>Полиамидная Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠ°</li><li>ΠšΠ°ΠΌΠ΅Ρ€Π° с тСплоизоляциСй</li><li>Π€ΠΈΡ‚ΠΈΠ½Π³ΠΈ ΠΈΠ· Π»Π°Ρ‚ΡƒΠ½ΠΈ ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΈΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ состава</li><li>Высокая ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Ρ‚Π΅ΠΏΠ»ΠΎΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ</li><li>Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΈ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ΠΎΠ² контроля</li></ul>', 'ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΡ': '<ul class="bullet"><li>Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30T</li><li>Π›Π°Ρ‚ΡƒΠ½Π½Ρ‹Π΅ Ρ„ΠΈΡ‚ΠΈΠ½Π³ΠΈ для ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°</li><li>Π’ΠΈΡ‚Π°Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Ρ€ΠΌΠ°Π½ для тСрмостата</li><li>ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»Π°ΠΏΠ°Π½</li><li>Π€ΠΈΡ‚ΠΈΠ½Π³ΠΈ соСдинСния, Π·Π°Π³Π»ΡƒΡˆΠΊΠ°, ΠΏΡ€ΠΎΠΊΠ»Π°Π΄ΠΊΠ°</li><li>ΠšΡ€Π΅ΠΏΠ΅ΠΆΠ½Π°Ρ скоба</li><li>Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ</li></ul>', 'ВСс, ΠΊΠ³': '2', 'MANUFACTURER': 'Elecro', 'Гарантия': '12 мСсяцСв', 'COUNTRY_OF_ORIGIN': 'ВСликобритания', 'DESCRIPTION': 'Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 для ΠΎΠ±ΠΎΠ³Ρ€Π΅Π²Π° бассСйнов. Π˜ΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΈΠ· Π½Π΅Ρ€ΠΆΠ°Π²Π΅ΡŽΡ‰Π΅ΠΉ стали, Ρ‚ΠΈΡ‚Π°Π½Π°, ΠΏΠΎΠ»ΠΈΠΌΠ΅Ρ€Π° ΠΈ Π»Π°Ρ‚ΡƒΠ½ΠΈ. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π΅Π²Π·ΠΎΠΉΠ΄Π΅Π½Π½ΠΎ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Ρ‚Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π° с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ тСплопотСрями. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для примСнСния с Π³Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΎΠΏΠ»ΠΈΠ²Π½Ρ‹ΠΌΠΈ Π±ΠΎΠΉΠ»Π΅Ρ€Π°ΠΌΠΈ, солнСчными панСлями ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚Π΅ΠΏΠ»ΠΎΠ²Ρ‹ΠΌΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°ΠΌΠΈ.', 'DESCRIPTION_FEATURE': '<li>ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ: 30 ΠΊΠ’Ρ‚</li><li>Π’Ρ€ΡƒΠ±ΠΊΠΈ: Ρ‚ΠΈΡ‚Π°Π½</li><li>ΠšΠΎΡ€ΠΏΡƒΡ: Π½Π΅Ρ€ΠΆ. ΡΡ‚Π°Π»ΡŒ 316</li><li>ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€: 1"</li><li>Π’Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€: 1.5"</li>', 'NAME': 'Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30 ΠΊΠ’Ρ‚ (titanium)', 'PRICE': '23\xa0381,00', 'SKU': '6973'}] pd.DataFrame(data).to_csv(r'd:/temp/result.csv', index=False) 

result:

 CATEGORY_ID,COUNTRY_OF_ORIGIN,DESCRIPTION,DESCRIPTION_FEATURE,IMAGE,IMAGES,MANUFACTURER,NAME,PRICE,SKU,STOCK_STATUS,"ВСс, ΠΊΠ³",Гарантия,Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ,ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΡ,ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ 28,ΠšΠΈΡ‚Π°ΠΉ,"Π£Π΄Π°Ρ€Π½Ρ‹ΠΉ, быстрорастворимый ΠΏΡ€Π΅ΠΏΠ°Ρ€Π°Ρ‚ содСрТащий 60% Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ…Π»ΠΎΡ€Π°. ΠŸΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ΡΡ Π² Π³Ρ€Π°Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ (шоковой) ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΎΠ΄Ρ‹ Π² бассСйнС. Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ вирусы, Π±Π°ΠΊΡ‚Π΅Ρ€ΠΈΠΈ, Π³Ρ€ΠΈΠ±ΠΎΠΊ, плСсСнь.",,https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/c/6/c60_5_1.jpg,[],AquaDoctor,AquaDoctor C-60 50 ΠΊΠ³. Π² Π³Ρ€Π°Π½ΡƒΠ»Π°Ρ…,"17 919,00",1551,False,,,,, 11,ВСликобритания,"Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 для ΠΎΠ±ΠΎΠ³Ρ€Π΅Π²Π° бассСйнов. Π˜ΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΈΠ· Π½Π΅Ρ€ΠΆΠ°Π²Π΅ΡŽΡ‰Π΅ΠΉ стали, Ρ‚ΠΈΡ‚Π°Π½Π°, ΠΏΠΎΠ»ΠΈΠΌΠ΅Ρ€Π° ΠΈ Π»Π°Ρ‚ΡƒΠ½ΠΈ. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π΅Π²Π·ΠΎΠΉΠ΄Π΅Π½Π½ΠΎ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Ρ‚Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π° с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ тСплопотСрями. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для примСнСния с Π³Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΎΠΏΠ»ΠΈΠ²Π½Ρ‹ΠΌΠΈ Π±ΠΎΠΉΠ»Π΅Ρ€Π°ΠΌΠΈ, солнСчными панСлями ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚Π΅ΠΏΠ»ΠΎΠ²Ρ‹ΠΌΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°ΠΌΠΈ.","<li>ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ: 30 ΠΊΠ’Ρ‚</li><li>Π’Ρ€ΡƒΠ±ΠΊΠΈ: Ρ‚ΠΈΡ‚Π°Π½</li><li>ΠšΠΎΡ€ΠΏΡƒΡ: Π½Π΅Ρ€ΠΆ. ΡΡ‚Π°Π»ΡŒ 316</li><li>ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€: 1""</li><li>Π’Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€: 1.5""</li>",https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_heat_exchanger_1_2.jpg,"['https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_combine-2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2_heat_exchange_5_2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/g/2/g2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/e/l/elec_g2.jpg', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/h/e/heat-exchanger-horizontal_s-2.png', 'https://aquapolis.ru/media/catalog/product/cache/1/image/1200x/040ec09b1e35df139433887a97daa66f/f/i/file_42_2.jpg']",Elecro,Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30 ΠΊΠ’Ρ‚ (titanium),"23 381,00",6973,,2,12 мСсяцСв,"<ul class=""bullet""><li>ΠšΠΎΡ€ΠΏΡƒΡ ΠΈΠ· Π½Π΅Ρ€ΠΆΠ°Π²Π΅ΡŽΡ‰Π΅ΠΉ стали BS 316L (EN 1.4432)</li><li>Π’Ρ€ΡƒΠ±ΠΊΠΈ ΠΈΠ· Ρ‚ΠΈΡ‚Π°Π½Π°</li><li>МаксимальноС Ρ€Π°Π±ΠΎΡ‡Π΅Π΅ Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ 4 Π‘Π°Ρ€</li><li>Π’Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π½Ρ‹Π΅ ограничСния ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° Ρ‚Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠ° G2: 90 ?</li><li>Полиамидная Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠ°</li><li>ΠšΠ°ΠΌΠ΅Ρ€Π° с тСплоизоляциСй</li><li>Π€ΠΈΡ‚ΠΈΠ½Π³ΠΈ ΠΈΠ· Π»Π°Ρ‚ΡƒΠ½ΠΈ ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΈΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ состава</li><li>Высокая ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Ρ‚Π΅ΠΏΠ»ΠΎΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ</li><li>Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΈ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ΠΎΠ² контроля</li></ul>","<ul class=""bullet""><li>Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30T</li><li>Π›Π°Ρ‚ΡƒΠ½Π½Ρ‹Π΅ Ρ„ΠΈΡ‚ΠΈΠ½Π³ΠΈ для ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°</li><li>Π’ΠΈΡ‚Π°Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Ρ€ΠΌΠ°Π½ для тСрмостата</li><li>ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»Π°ΠΏΠ°Π½</li><li>Π€ΠΈΡ‚ΠΈΠ½Π³ΠΈ соСдинСния, Π·Π°Π³Π»ΡƒΡˆΠΊΠ°, ΠΏΡ€ΠΎΠΊΠ»Π°Π΄ΠΊΠ°</li><li>ΠšΡ€Π΅ΠΏΠ΅ΠΆΠ½Π°Ρ скоба</li><li>Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ</li></ul>",30 ΠΊΠ’Ρ‚ 
  • Hello in the final file, all Russian names have some kind of left encoding, tried to specify encoding = 'utf-8', did not help - danilshik
  • Example 1: CATEGORY_ID, COUNTRY_OF-
  • That you have opened the file saved in UTF-8 encoded CP-1251 . You can explicitly set the encoding: pd.DataFrame(data).to_csv(r'd:/temp/result.csv', index=False, encoding='cp1251') - MaxU
  • I just need to save in utf-8, but so that everything is normal with the Latin alphabet. - danilshik
  • Sorry, this Excel tupit, opened through VS Code with indication of the encoding, it became all the rules - danilshik

I understand that you need csv.DictReader and csv.DictWriter functionality . The first reads data into OrderedDict , while if the number of fields in the header is larger than in the data, it replaces the data by default with None. Well, the second method writes all this beauty.

UPDATE (after additional explanations of the author of the question)

It seems that the task formally boils down to merging the list of keys in the dictionaries. In this case, the solution may be as follows:

 import pprint #Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для красивого Π²Ρ‹Π²ΠΎΠ΄Π° dict1 = {'NAME': 'AquaDoctor C-60 50 ΠΊΠ³. Π² Π³Ρ€Π°Π½ΡƒΠ»Π°Ρ…', 'IMAGE': '1_2.jpg', 'PRICE': '17\xa0919,00', 'STOCK_STATUS': False, 'SKU': '1551', 'CATEGORY_ID': 28, 'DESCRIPTION': 'blah', 'DESCRIPTION_FEATURE': ''} dict2={'CATEGORY_ID': 11, 'IMAGE': '1_2.jpg', 'IMAGES': ['s-2.png', '42_2.jpg'], 'ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΡ': 'Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30T', 'ВСс, ΠΊΠ³': '2', 'MANUFACTURER': 'Elecro', 'Гарантия': '12 мСсяцСв', 'COUNTRY_OF_ORIGIN': 'ВСликобритания', 'DESCRIPTION': 'foo', 'NAME': 'Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30 ΠΊΠ’Ρ‚ (titanium)', 'PRICE': '23\xa0381,00', 'SKU': '6973'} new1 = {**dict.fromkeys(dict1.keys(),''), **dict2} new2 = {**dict.fromkeys(dict2.keys(),''), **dict1} pprint.pprint(new1) pprint.pprint(new2) 

At the exit we will have:

 {'CATEGORY_ID': 11, 'COUNTRY_OF_ORIGIN': 'ВСликобритания', 'DESCRIPTION': 'foo', 'DESCRIPTION_FEATURE': '', 'IMAGE': '1_2.jpg', 'IMAGES': ['s-2.png', '42_2.jpg'], 'MANUFACTURER': 'Elecro', 'NAME': 'Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30 ΠΊΠ’Ρ‚ (titanium)', 'PRICE': '23\xa0381,00', 'SKU': '6973', 'STOCK_STATUS': '', 'ВСс, ΠΊΠ³': '2', 'Гарантия': '12 мСсяцСв', 'ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΡ': 'Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30T'} {'CATEGORY_ID': 28, 'COUNTRY_OF_ORIGIN': '', 'DESCRIPTION': 'blah', 'DESCRIPTION_FEATURE': '', 'IMAGE': '1_2.jpg', 'IMAGES': '', 'MANUFACTURER': '', 'NAME': 'AquaDoctor C-60 50 ΠΊΠ³. Π² Π³Ρ€Π°Π½ΡƒΠ»Π°Ρ…', 'PRICE': '17\xa0919,00', 'SKU': '1551', 'STOCK_STATUS': False, 'ВСс, ΠΊΠ³': '', 'Гарантия': '', 'ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΡ': ''} 

As you can see, the set of keys is the same for everyone, unique values ​​are stored for each dictionary, and the missing key values ​​are indicated by the empty string ''.

UPDATE # 2 Saving everything that we have done in the csv-file:

 fieldnames = new1.keys() with open('111.csv', 'w',encoding='utf-8-sig') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow(new1) writer.writerow(new2) 

At the exit:

 NAME,IMAGE,PRICE,STOCK_STATUS,SKU,CATEGORY_ID,DESCRIPTION,DESCRIPTION_FEATURE,IMAGES,ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΡ,"ВСс, ΠΊΠ³",MANUFACTURER,Гарантия,COUNTRY_OF_ORIGIN Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30 ΠΊΠ’Ρ‚ (titanium),1_2.jpg,"23 381,00",,6973,11,foo,,"['s-2.png', '42_2.jpg']",Π’Π΅ΠΏΠ»ΠΎΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ Elecro G2 HE 30T,2,Elecro,12 мСсяцСв,ВСликобритания AquaDoctor C-60 50 ΠΊΠ³. Π² Π³Ρ€Π°Π½ΡƒΠ»Π°Ρ…,1_2.jpg,"17 919,00",False,1551,28,blah,,,,,,, 
  • And how do I know the fieldnames? Each time you add a product, check the fields for it and if they are added to Header - danilshik
  • @danilshik I suppose that 1) they considered the main csv - its header was saved in OrderedDict 2) they considered the new csv - its header was added to the saved OrderedDict using the update method 3) they saved the data to a file. - strawdog
  • I do not use data from csv. The data I have represent the values ​​that I gave from the site. And I need to save them in a csv-file - danilshik
  • Yes something like that. Now how to save to csv file? More precisely, the questions are connected, how to save correctly the header (keys) - danilshik