Как сохранить словарь в формате CSV по столбцам с помощью Python?

Вы пишете данные в одну ячейку вместо того, чтобы правильно распределить их по столбцам. Как можно исправить код, чтобы данные записывались в соответствующие колонки CSV файла?
  • 5 октября 2024 г. 6:04
Ответы на вопрос 2
Чтобы сохранить словарь в формате CSV по столбцам, вам нужно убедиться, что структура словаря соответствует необходимому формату для записи в CSV. Наиболее распространенный способ представления данных в CSV — это использование списка словарей, где каждый словарь представляет собой строку в таблице, а ключи словаря — названия столбцов.

Пример словаря, который можно записать в CSV:

```python
data = [
    {'name': 'Alice', 'age': 30, 'city': 'New York'},
    {'name': 'Bob', 'age': 25, 'city': 'Los Angeles'},
    {'name': 'Charlie', 'age': 35, 'city': 'Chicago'}
]
```

Чтобы сохранить этот словарь в формате CSV, вы можете использовать модуль `csv`. Вот пример кода:

```python
import csv

data = [
    {'name': 'Alice', 'age': 30, 'city': 'New York'},
    {'name': 'Bob', 'age': 25, 'city': 'Los Angeles'},
    {'name': 'Charlie', 'age': 35, 'city': 'Chicago'}
]

# Укажите имя файла, в который будете записывать данные
filename = 'output.csv'

# Открываем файл в режиме записи
with open(filename, mode='w', newline='') as csv_file:
    fieldnames = data[0].keys()  # Получаем названия столбцов из первого словаря
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

    writer.writeheader()  # Записываем заголовки столбцов
    for row in data:
        writer.writerow(row)  # Записываем каждую строку

print(f'Data saved to {filename}')
```

Этот код создаст файл `output.csv`, в котором данные будут правильно распределены по столбцам. Обратите внимание на использование `DictWriter`, который позволяет нам записывать словари непосредственно в CSV формат.
У меня ваш код работает отлично. Создает csv с разделителями запятыми, корректно открывающийся в стороннем приложении (например, Numbers на macos). 

Возможно, вам хотелось сделать csv с табуляциями - используйте параметр dialect (описан в документации к библиотеке csv).
Вот я чуток переделал для примера:
import csv
import os
from pathlib import Path

# Данные из переменной 'a'
my_row = {
    'url': 'https://www.coindesk.com/policy/2024/08/08/ftx-alameda-ordered-to-pay-127b-to-creditors-by-us-judge/',
    'title': 'FTX, Alameda Ordered to Pay $12.7B to Creditors by U.S. Judge',
    'author': 'Shaurya Malwa',
    'date': 'Aug 8, 2024 at 6:44 a.m. UTC'
}
# делаю три строчки для примера массива.
data = [my_row] * 3

# Имя CSV файла
dir_path = Path(os.path.dirname(os.path.realpath(__file__)))
pathname = dir_path / 'data'
if not pathname.exists():
    os.mkdir(pathname)
filename = pathname / 'data3.csv'



# Открываем файл в режиме добавления (append) с возможностью чтения (a+)
with open(filename, mode='a+', newline='', encoding='utf-8') as file:
    # Создаем объект writer для записи данных в CSV
    writer = csv.DictWriter(file, fieldnames=data[0].keys(), dialect='excel-tab')

    # Если файл пустой или только что создан, записываем заголовки
    if not filename.exists() or file.tell() == 0:
        writer.writeheader()  # Записываем заголовки (названия столбцов)

    # Записываем строки данных (содержимое столбцов)
    for row in data:
        writer.writerow(row)
Похожие вопросы