Каким образом можно изменить запись в CSV файле, используя Python?

  • 21 августа 2023 г. 9:16
Ответы на вопрос 2
Ваш код практически правильный. Однако есть несколько изменений, которые нужно внести:

1. После определения объекта DictWriter, вам следует вызвать метод `.writeheader()`, чтобы записать заголовки полей в файл:

```python
with open('directory.csv', 'r+', encoding='utf-8', newline="") as f:
    reader = csv.DictReader(f)
    fieldnames = ['Имя', 'Фамилия', 'Отчество', 'Организация', 'Рабочий телефон', 'Личный телефон']
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
```

2. После того, как вы изменяете значения строки, добавьте только ту строку в список `entries`, которую вы изменили. Это позволит вам сохранять только измененные строки:

```python
for row in reader:
    if row["Имя"] == name and row["Фамилия"] == last_name and row["Отчество"] == surname:
        # ваш код
    else:
        entries.append(row)
```

3. Наконец, после записи измененных данных в файл, добавьте вызов метода `.truncate()`, чтобы удалить исходное содержимое файла:

```python
f.seek(0)
writer.writeheader()
writer.writerows(entries)
f.truncate()
```

После этих изменений ваш код будет выглядеть примерно так:

```python
import csv

def update_entry():
    name = input('Введите имя, чьи данные вы хотите изменить: ')
    last_name = input('Введите фамилию, чьи данные вы хотите изменить: ')
    surname = input('Введите отчество, чьи данные вы хотите изменить: ')
    
    with open('directory.csv', 'r+', encoding='utf-8', newline="") as f:
        reader = csv.DictReader(f)
        fieldnames = ['Имя', 'Фамилия', 'Отчество', 'Организация', 'Рабочий телефон', 'Личный телефон']
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        entries = []
        
        for row in reader:
            if row["Имя"] == name and row["Фамилия"] == last_name and row["Отчество"] == surname:
                # ваш код
            else:
                entries.append(row)
        
        f.seek(0)
        writer.writeheader()
        writer.writerows(entries)
        f.truncate()
```

Надеюсь, что это поможет вам в решении вашей задачи!
Нет более простого способа для этой задачи, чем использование библиотеки pandas. Вот пример кода, которым можно создать игрушечный пример и обновлять подмножества данных по введению пользователем.

import pandas as pd

# Создание файла
df = pd.DataFrame({
    'Name':['Petr','Maks','Aleksandr'],
    'Age':[30,40,50],
    'Salary':[500,700,600]
})
df.to_csv('data.csv', index=False)

# Обновление данных
name = input('Введите имя, чьи данные хотите изменить: ')
fields_to_change = input('Какие данные вы хотите изменить? (например: Age, Salary): ').split(',')
data_to_update = {}

for field in fields_to_change:
    data_to_update[field] = input(f'Введите новое значение для {field}: ')

df = pd.read_csv('data.csv').set_index('Name')
df.loc[name, fields_to_change] = data_to_update
df.to_csv('data.csv')

print('Спасибо, данные обновлены')

Вторая часть кода представляет собой сам процесс обновления данных, который вам интересен.
Похожие вопросы