@barboskin93

Как в Python можно изменить запись в CSV?

Есть файл CSV с записями в виде словаря (csv.DictWriter). Можно ли как-то изменить данные в строке? (определенной колонке?). Смог только додуматься, что бы изменять какую-либо строку, и уже измененную записывать в конец файла. Но при этом изначальная строка тоже остается. Или как-то ее возможно удалить?
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)
        for row in reader:
            if row["Имя"] == name and row["Фамилия"] == last_name and row["Отчество"] == surname:
                # print(row)
                print('Какие данные Вы хотите изменить? (Имя, Фамилия, Отчество, Организация, Рабочий телефон, Личный телефон)')
                command = input('Введите, что хотите изменить: ')
                if command == 'Имя':
                    name_new = input('Введите новое значение: ')
                    row.update({'Имя': name_new})
                    writer.writerow(row)
  • Вопрос задан
  • 757 просмотров
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Нет ничего проще для такой задачи чем использовать pandas.
Вот сделал игрушечный пример, сначала создаю csv в первой части для демонстрации, потом обновляю любые подсеты данных, при вводе пользователя.
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('Спасибо, данные обновлены')

Вторая часть это непосредственно код который будет обновлять. То есть та часть которая тебя интересует.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Нет, по-простому нельзя. Единственный простой подход (который показал выше Максим Припадчев) - загрузить целиком в память, там изменить, потом выгрузить назад. Для больших CSV файлов это ресурсоёмко.

CSV вообще не предназначен для долговременного хранения данных - скорее, для импорта/экспорта.

Ты мог бы попытаться использовать методы tell() и seek(), чтобы "запомнить" позицию удаляемой строки, а затем в цикле копировать всё что идёт после, "пододвинув" содержимое внутри файла, а потом уже дописать в конец изменённую строку. Но это всё равно долго.

Лучше импортируй файл в базу SQLite, и работай в дальнейшем уже с ней.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы