
CSV файлы – один из самых популярных форматов для хранения данных в табличном виде. Их часто используют в аналитике, при импорте и экспорте данных между различными приложениями. Работа с такими файлами в Python возможна с помощью встроенных библиотек, таких как csv, а также более продвинутых решений, например, pandas. В этой статье мы рассмотрим, как эффективно изменять CSV файлы с помощью Python, избегая ненужных сложностей.
Для работы с CSV в Python существует два основных подхода: использование стандартной библиотеки csv и библиотеки pandas, которая предлагает более высокоуровневый интерфейс для манипуляций с данными. csv хорош для простых операций с файлами, например, при чтении или записи строк. В то время как pandas предоставляет мощные функции для обработки больших объемов данных, фильтрации, агрегирования и визуализации. Выбор подхода зависит от сложности задачи и объема данных.
Первым шагом при работе с CSV файлом является его правильное открытие. В Python это можно сделать через csv.reader или pandas.read_csv(), в зависимости от того, насколько сложной является задача. Для изменения данных в CSV файле следует использовать методы записи, такие как csv.writer или DataFrame.to_csv() в pandas, что позволяет без усилий модифицировать строки, добавлять новые столбцы или удалять ненужные данные.
Чтение CSV файлов с использованием библиотеки pandas

Для начала необходимо установить pandas, если он ещё не установлен. Это можно сделать с помощью команды:
pip install pandas
Пример простого чтения CSV файла:
import pandas as pd
data = pd.read_csv('data.csv')
print(data.head())
Функция read_csv() имеет множество параметров, которые могут пригодиться в разных ситуациях. Например, параметр delimiter позволяет указать разделитель, если он отличается от стандартной запятой. Для разделителя табуляцией, например, можно использовать:
data = pd.read_csv('data.tsv', delimiter='\t')
Если файл содержит заголовки в строках, отличных от первой, можно использовать параметр header. Например, если заголовки находятся в третьей строке:
data = pd.read_csv('data.csv', header=2)
Иногда CSV файлы могут содержать пропущенные значения. Для обработки пропусков используйте параметр na_values, чтобы указать, какие символы или строки следует считать пустыми. Пример:
data = pd.read_csv('data.csv', na_values=['NA', 'missing'])
Если необходимо читать только несколько столбцов из файла, можно указать нужные имена столбцов через параметр usecols. Например:
data = pd.read_csv('data.csv', usecols=['Column1', 'Column3'])
Для больших файлов можно настроить чтение по частям с использованием параметра chunksize, который позволяет загружать данные порциями. Это полезно для экономии памяти при работе с большими объемами данных:
chunk_size = 1000
for chunk in pd.read_csv('large_data.csv', chunksize=chunk_size):
process(chunk)
Кроме того, можно указать кодировку файла с помощью параметра encoding, если файл содержит символы, не поддерживаемые по умолчанию. Например, для файлов с кодировкой Windows-1251:
data = pd.read_csv('data.csv', encoding='windows-1251')
Библиотека pandas автоматически распознает типы данных для каждого столбца, но иногда полезно вручную указать типы с помощью параметра dtypes, что помогает избежать проблем с некорректной интерпретацией данных. Пример:
data = pd.read_csv('data.csv', dtype={'Column1': int, 'Column2': float})
Использование pandas для чтения CSV файлов позволяет гибко настраивать процесс импорта данных, что значительно упрощает дальнейшую работу с ними и повышает производительность при анализе больших наборов данных.
Как добавить новые строки в существующий CSV файл
Чтобы добавить новые строки в CSV файл с помощью Python, можно использовать модуль csv, который предоставляет удобный способ работы с такими файлами. Для добавления строк нужно открыть файл в режиме добавления («a»), что позволит не перезаписать данные, а просто добавить новые записи в конец файла.
Пример добавления строк в существующий CSV файл:
import csv
# Данные для добавления
new_rows = [
['Иванов', 'Иван', '25'],
['Петров', 'Петр', '30']
]
# Открытие файла в режиме добавления
with open('example.csv', mode='a', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerows(new_rows)
Важно использовать параметр newline='' , чтобы избежать лишних пустых строк между записями при добавлении данных. Это важно для корректной структуры CSV файла, особенно при работе с разделителями, такими как запятая.
При добавлении строк в CSV файл, важно, чтобы количество колонок в новых строках соответствовало числу столбцов в существующем файле, иначе могут возникнуть ошибки или искажение данных.
Если необходимо добавить строку с заголовками в уже существующий CSV файл, стоит предварительно проверить, есть ли в нем заголовки. Если нет, их можно добавить вручную перед основными данными.
Пример добавления заголовков в CSV файл, если их нет:
import os
# Проверка на наличие заголовков
if not os.path.exists('example.csv'):
with open('example.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['Фамилия', 'Имя', 'Возраст'])
# Добавление новых данных
new_rows = [['Сидоров', 'Сидор', '40']]
with open('example.csv', mode='a', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerows(new_rows)
Такой подход гарантирует, что заголовки не будут дублироваться, а новые строки будут добавляться правильно.
Удаление или замена данных в CSV файле через Python
Первый шаг при работе с CSV файлом – его чтение. Для этого используется метод `csv.reader()`, который позволяет получить доступ к данным построчно. Важно, что файл не изменяется напрямую, пока не будет перезаписан с обновленными значениями.
Чтобы удалить данные из определенной ячейки или строки, нужно пройтись по строкам, проверяя условия, и исключить те, которые не соответствуют критериям. Например, можно удалить все строки, в которых в одном из столбцов встречается определённое значение.
Пример удаления строк, где значение в столбце «Возраст» меньше 18:
import csv
with open('data.csv', 'r', newline='') as infile:
reader = csv.reader(infile)
rows = [row for row in reader if int(row[2]) >= 18] # Индекс 2 - столбец "Возраст"
with open('data.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
writer.writerows(rows)
В этом примере строки с возрастом младше 18 лет исключаются, и измененный набор данных записывается обратно в файл.
Если требуется заменить данные, например, изменить значение в определённом столбце, можно воспользоваться следующим подходом. Пример замены значений в столбце «Статус» на «Активный», если значение в столбце «Возраст» больше 60:
import csv
with open('data.csv', 'r', newline='') as infile:
reader = csv.reader(infile)
rows = []
for row in reader:
if int(row[2]) > 60: # Если возраст больше 60
row[3] = 'Активный' # Изменяем значение в столбце "Статус"
rows.append(row)
with open('data.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
writer.writerows(rows)
В данном примере значение в столбце «Статус» заменяется на «Активный», если возраст в столбце «Возраст» больше 60 лет. Такой подход позволяет точно контролировать, какие значения и когда должны быть заменены.
При работе с большими CSV файлами, когда требуется изменить множество данных, использование библиотеки `pandas` может быть более эффективным, так как она поддерживает удобные методы фильтрации и замены данных в DataFrame.
Для замены значений с помощью `pandas` можно использовать метод `replace()`, а для удаления строк – `drop()`. Этот способ требует дополнительной загрузки данных в память, что стоит учитывать при работе с большими файлами.
Изменение структуры столбцов в CSV файле с pandas
Для начала нужно загрузить CSV файл в DataFrame с помощью функции read_csv()>.
import pandas as pd
df = pd.read_csv('data.csv')
Предположим, что в вашем DataFrame столбцы имеют следующий порядок: "A", "B", "C", "D". Вы хотите изменить его на "D", "C", "B", "A". Для этого создайте новый список столбцов в нужной последовательности и примените его к DataFrame.
new_order = ['D', 'C', 'B', 'A']
df = df[new_order]
После этого DataFrame будет содержать столбцы в новом порядке. Чтобы сохранить результат в новый CSV файл, используйте функцию to_csv()>.
df.to_csv('modified_data.csv', index=False)
Если необходимо только переместить один или несколько столбцов, не меняя остальные, можно использовать более гибкие методы индексации. Например, чтобы переместить столбец "D" в начало, выполните следующие действия:
cols = ['D'] + [col for col in df.columns if col != 'D']
df = df[cols]
В результате столбец "D" окажется первым, а остальные столбцы останутся на своих местах. Можно комбинировать эти подходы для более сложных операций с порядком столбцов.
Для работы с большим количеством столбцов или при необходимости выполнения более сложных преобразований удобно использовать функции, которые выполняют реорганизацию с использованием словарей. Например, если нужно поменять местами только два столбца, это можно сделать так:
df = df[['A', 'B', 'C', 'D']].reindex(columns=['A', 'D', 'C', 'B'])
Такие методы позволяют эффективно изменять структуру данных, избегая лишних вычислений и сохранят вашу работу с большими объемами данных на высоком уровне производительности.
Пример исходных данных:
| A | B | C | D |
|---|---|---|---|
| 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 |
После изменения структуры столбцов, например, на порядок "D", "C", "B", "A", данные будут представлены так:
| D | C | B | A |
|---|---|---|---|
| 4 | 3 | 2 | 1 |
| 8 | 7 | 6 | 5 |
Объединение нескольких CSV файлов в один

Для объединения нескольких CSV файлов в один в Python чаще всего используют библиотеку Pandas, которая предоставляет простой и эффективный способ работы с табличными данными. Чтобы объединить файлы, необходимо использовать функцию pandas.concat(), которая позволяет легко объединить данные по строкам или столбцам.
Предположим, у вас есть несколько CSV файлов с одинаковой структурой (одинаковыми столбцами), и нужно объединить их в один файл. В таком случае алгоритм будет следующим:
import pandas as pd
import glob
# Считывание всех CSV файлов из указанной директории
files = glob.glob('путь/к/папке/*.csv')
# Создание пустого списка для хранения данных
data_frames = []
# Загрузка каждого CSV файла и добавление его в список
for file in files:
df = pd.read_csv(file)
data_frames.append(df)
# Объединение всех данных в один DataFrame
combined_df = pd.concat(data_frames, ignore_index=True)
# Сохранение объединённых данных в новый CSV файл
combined_df.to_csv('объединённый_файл.csv', index=False)
В приведенном примере используется функция glob.glob() для нахождения всех файлов с расширением .csv в указанной директории. Затем каждый файл загружается с помощью pandas.read_csv(), и все DataFrame-ы объединяются в один с помощью pandas.concat().
Важно установить ignore_index=True, чтобы индексы строк в объединенном файле не дублировались, а нумерация шла последовательно. Если вам нужно сохранить оригинальные индексы, можно пропустить этот параметр.
Если структура CSV файлов отличается (разные столбцы), то можно использовать параметр join в функции concat(). Например, join='outer' объединит столбцы по принципу объединения внешними ключами, добавив пустые значения в тех местах, где столбцы не совпадают.
combined_df = pd.concat(data_frames, join='outer', ignore_index=True)
Кроме того, если нужно объединить данные по столбцам (горизонтально), можно использовать параметр axis=1. Важно при этом убедиться, что количество строк в каждом файле совпадает, иначе вы получите несоответствие данных.
combined_df = pd.concat(data_frames, axis=1)
После того как данные объединены, их можно сохранить в новый CSV файл с помощью to_csv(). Важно указать index=False, чтобы избежать записи индексов в итоговый файл, если это не требуется.
Фильтрация данных в CSV файле по условию

Пример фильтрации с использованием pandas:
import pandas as pd
# Чтение данных из CSV
df = pd.read_csv('data.csv')
# Фильтрация строк, где значение в столбце 'age' больше 30
filtered_df = df[df['age'] > 30]
# Запись результата в новый CSV файл
filtered_df.to_csv('filtered_data.csv', index=False)
В данном примере, мы считываем данные из файла data.csv, выбираем строки, где значение в столбце age больше 30, и сохраняем результат в новый файл filtered_data.csv.
Для более сложных условий фильтрации можно использовать логические операторы, такие как && (и) и || (или). Например, фильтрация данных по двум условиям:
filtered_df = df[(df['age'] > 30) & (df['city'] == 'Moscow')]
Если необходимо выполнить фильтрацию без использования pandas, можно работать с модулем csv. Например, для фильтрации данных по условию:
import csv
# Открытие CSV файла для чтения
with open('data.csv', mode='r') as infile:
reader = csv.DictReader(infile)
filtered_rows = [row for row in reader if int(row['age']) > 30]
# Запись отфильтрованных данных в новый CSV файл
with open('filtered_data.csv', mode='w', newline='') as outfile:
writer = csv.DictWriter(outfile, fieldnames=filtered_rows[0].keys())
writer.writeheader()
writer.writerows(filtered_rows)
Этот код читает исходный CSV файл, фильтрует строки по значению столбца age и сохраняет результат в новый файл. При фильтрации можно использовать любые условия: числовые, строковые, комбинированные.
Если нужно выполнить более сложную фильтрацию, например, работать с диапазонами дат или фильтровать по нескольким полям одновременно, можно комбинировать условия с помощью lambda или регулярных выражений.
- Для фильтрации по диапазону дат используйте
pd.to_datetime()в pandas илиdatetimeв стандартной библиотеке. - При фильтрации по строкам удобно использовать методы
str.contains()или регулярные выражения.
Эффективность фильтрации зависит от объёма данных. Для работы с большими CSV файлами рекомендуется использовать библиотеки, которые обеспечивают оптимизацию памяти и скорости, такие как pandas или dask.
В зависимости от размера исходного файла и типа фильтрации, вы можете выбирать между использованием pandas для более высокоуровневой работы или csv для манипуляций с меньшими объемами данных. Однако для производительности в больших проектах предпочтительнее использовать pandas благодаря его удобству и скорости работы с большими объемами данных.
Сохранение изменений в новом CSV файле
После внесения изменений в CSV файл с помощью Python, важно правильно сохранить результаты в новый файл, чтобы не потерять исходные данные и обеспечить доступ к обновленной информации. В этом процессе можно использовать модуль csv, который предоставляет простой и эффективный способ записи данных в новый CSV файл.
Для начала откройте новый файл на запись с помощью open и укажите параметр 'w', чтобы перезаписать его содержимое. Далее, используйте объект csv.writer() для записи данных. Убедитесь, что вы указали правильный параметр разделителя, если используете нестандартный символ (по умолчанию это запятая).
Пример кода для сохранения изменений в новый файл:
import csv
# Пример данных
data = [['Имя', 'Возраст', 'Город'],
['Иван', 28, 'Москва'],
['Алексей', 34, 'Санкт-Петербург']]
# Открытие нового файла для записи
with open('new_file.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file, delimiter=',')
# Запись данных
writer.writerows(data)
В этом примере данные записываются в новый файл new_file.csv. Важно использовать параметр newline='', чтобы избежать появления пустых строк между строками при записи на некоторых операционных системах.
Если нужно записать данные с заголовками, следует сначала записать строку заголовков, а затем данные:
with open('new_file_with_headers.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
# Запись заголовков
writer.writerow(['Имя', 'Возраст', 'Город'])
# Запись данных
writer.writerows(data)
Для более сложных случаев, когда необходимо сохранить данные в формате с разделителями, отличными от запятой (например, точка с запятой), измените параметр delimiter в функции csv.writer().
Кроме того, если вы работаете с большими объемами данных, рекомендуется использовать режим записи в файл по частям или с использованием буферизации, чтобы избежать чрезмерного использования памяти.
Вопрос-ответ:
Как открыть CSV файл в Python для редактирования?
В Python CSV файл можно открыть с помощью стандартного модуля csv или библиотеки pandas. С csv это выглядит так: сначала используем функцию open с режимом чтения, затем создаём объект csv.reader. После получения данных их можно изменять и сохранять через csv.writer. При использовании pandas открытие проще: df = pandas.read_csv('file.csv'), где df — объект DataFrame, с которым удобно работать.
Можно ли добавлять новые строки в существующий CSV файл?
Да, добавление строк возможно. С модулем csv файл открывают в режиме 'a' (append), создают объект csv.writer и используют метод writerow для добавления новой строки. В pandas добавление выглядит через создание нового DataFrame с нужной строкой и объединение с исходным с помощью pd.concat, после чего результат сохраняется в CSV.
Как заменить значения в определённом столбце CSV файла?
Если используется pandas, замена значений столбца удобна через прямое обращение к нему. Например, df['столбец'] = df['столбец'].replace('старое', 'новое'). С модулем csv нужно прочитать все строки в список, пройтись циклом и изменить нужные значения по индексу столбца, а затем записать изменённые строки обратно в файл.
Как корректно работать с CSV файлами, где разделителем является не запятая?
В CSV могут использоваться другие символы как разделители, например точка с запятой или табуляция. При чтении через csv.reader нужно указать параметр delimiter=';' или другой символ. В pandas применяется аргумент sep=';' в read_csv. То же самое при записи: важно сохранить правильный разделитель, чтобы файл оставался читаемым для других программ.
Можно ли удалять строки из CSV файла без потери других данных?
Да, для этого сначала загружают весь файл в память (например, через pandas или csv.reader), определяют строки, которые нужно удалить, и создают новый список или DataFrame без этих строк. Затем результат записывают обратно в CSV. Этот способ сохраняет все остальные данные без изменений.
