Как записать в csv файл си

Обновлено: 06.07.2024

Формат CSV является наиболее часто используемым форматом импорта и экспорта для баз данных и электронных таблиц. В этом руководстве будет подробно рассказано о CSV, а также о модулях и классах, доступных для чтения и записи данных в файлы CSV. Также будет рассмотрен рабочий пример, показывающий, как читать и записывать данные в файл CSV на Python.

Что такое файл CSV?

Файл CSV (значения, разделенные запятыми) позволяет сохранять данные в табличной структуре с расширением .csv. CSV-файлы широко используются в приложениях электронной коммерции, поскольку их очень легко обрабатывать. Некоторые из областей, где они были использованы, включают в себя:

  • импорт и экспорт данных клиентов
  • импорт и экспорт продукции
  • экспорт заказов
  • экспорт аналитических отчетов по электронной коммерции

Модули для чтения и записи

Модуль CSV имеет несколько функций и классов, доступных для чтения и записи CSV, и они включают в себя:

  • функция csv.reader
  • функция csv.writer
  • класс csv.Dictwriter
  • класс csv.DictReader

csv.reader

Модуль csv.reader принимает следующие параметры:

  • csvfile : обычно это объект, который поддерживает протокол итератора и обычно возвращает строку каждый раз, когда вызывается его метод __next__() .
  • dialect='excel': необязательный параметр, используемый для определения набора параметров, специфичных для определенного диалекта CSV.
  • fmtparams : необязательный параметр, который можно использовать для переопределения существующих параметров форматирования.

Вот пример того, как использовать модуль csv.reader.

модуль csv.writer

Этот модуль похож на модуль csv.reader и используется для записи данных в CSV. Требуется три параметра:

  • csvfile : это может быть любой объект с методом write() .
  • dialect = 'excel' : необязательный параметр, используемый для определения набора параметров, специфичных для конкретного CSV.
  • fmtparam : необязательный параметр, который можно использовать для переопределения существующих параметров форматирования.

Классы DictReader и DictWriter

DictReader и DictWriter - это классы, доступные в Python для чтения и записи в CSV. Хотя они и похожи на функции чтения и записи, эти классы используют объекты словаря для чтения и записи в CSV-файлы.

DictReader

Он создает объект, который отображает прочитанную информацию в словарь, ключи которого задаются параметром fieldnames . Этот параметр является необязательным, но если он не указан в файле, данные первой строки становятся ключами словаря.

DictWriter

Этот класс аналогичен классу DictWriter и выполняет противоположную функцию: запись данных в файл CSV. Класс определяется как csv.DictWriter(csvfile, fieldnames,restval='', extrasaction='raise',dialect='excel', *args, **kwds)

Параметр fieldnames определяет последовательность ключей, которые определяют порядок, в котором значения в словаре записываются в файл CSV. В отличие от DictReader, этот ключ не является обязательным и должен быть определен во избежание ошибок при записи в CSV.

Диалекты и форматирование

Диалект - это вспомогательный класс, используемый для определения параметров для конкретного экземпляра reader или writer . Диалекты и параметры форматирования должны быть объявлены при выполнении функции чтения или записи.

Есть несколько атрибутов, которые поддерживаются диалектом:

  • delimiter: строка, используемая для разделения полей. По умолчанию это ',' .
  • double quote: Управляет тем, как должны появляться в кавычках случаи, когда кавычки появляются внутри поля. Может быть True или False.
  • escapechar: строка, используемая автором для экранирования разделителя, если в кавычках задано значение QUOTE_NONE .
  • lineterminator: строка, используемая для завершения строк, созданных writer . По умолчанию используется значение '\r\n' .
  • quotechar: строка, используемая для цитирования полей, содержащих специальные символы. По умолчанию это '"' .
  • skipinitialspace: Если установлено значение True , любые пробелы, следующие сразу за разделителем, игнорируются.
  • strict: если установлено значение True , возникает Error при неправильном вводе CSV.
  • quoting: определяет, когда следует создавать кавычки при чтении или записи в CSV.

Чтение файла CSV

Давайте посмотрим, как читать CSV-файл, используя вспомогательные модули, которые мы обсуждали выше.

Создайте свой CSV-файл и сохраните его как example.csv. Убедитесь, что он имеет расширение .csv и заполните некоторые данные. Здесь у нас есть CSV-файл, который содержит имена учеников и их оценки.

Creating a spreadsheet to generate a CSV
Creating a spreadsheet to generate a CSV
Creating a spreadsheet to generate a CSV

Ниже приведен код для чтения данных в нашем CSV с использованием функции csv.reader и класса csv.DictReader .

Чтение CSV-файла с помощью csv.reader

В приведенном выше коде мы импортируем модуль CSV, а затем открываем наш файл CSV в виде File . Затем мы определяем объект reader и используем метод csv.reader для извлечения данных в объект. Затем мы перебираем объект reader и извлекаем каждую строку наших данных.

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

Вывод

Чтение CSV-файла с помощью DictReader

Как мы упоминали выше, DictWriter позволяет нам читать CSV-файл, отображая данные в словарь вместо строк, как в случае с модулем csv.reader . Хотя имя поля является необязательным параметром, важно всегда помечать столбцы для удобства чтения.

Вот как читать CSV, используя класс DictWriter.

Сначала мы импортируем модуль csv и инициализируем пустой список results , который мы будем использовать для хранения полученных данных. Затем мы определяем объект reader и используем метод csv.DictReader для извлечения данных в объект. Затем мы перебираем объект reader и извлекаем каждую строку наших данных.

Наконец, мы добавляем каждую строку в список результатов и выводим содержимое на консоль.

Вывод

Как вы можете видеть выше, лучше использовать класс DictReader, потому что он выдает наши данные в формате словаря, с которым легче работать.

Запись в файл CSV

Давайте теперь посмотрим, как приступить к записи данных в файл CSV с использованием функции csv.writer и класса csv.Dictwriter , которые обсуждались в начале этого урока.

Запись в файл CSV с помощью csv.writer

Код ниже записывает данные, определенные в файл example2.csv .

Сначала мы импортируем модуль csv, и функция writer() создаст объект, подходящий для записи. Чтобы перебрать данные по строкам, нам нужно использовать функцию writerows() .

Вот наш CSV с данными, которые мы записали в него.

Our CSV with the data we have written to it
Our CSV with the data we have written to it
Our CSV with the data we have written to it

Запись в файл CSV с использованием DictWriter

Давайте напишем следующие данные в CSV.

Код, как показано ниже.

Сначала мы определим fieldnames , которые будут представлять заголовки каждого столбца в файле CSV. Метод writerrow() будет записывать по одной строке за раз. Если вы хотите записать все данные одновременно, вы будете использовать метод writerrows() .

Вот как можно записать все строки одновременно.

Заключение

В этом руководстве рассматривается большинство вопросов, необходимых для успешного чтения и записи в файл CSV с использованием различных функций и классов, предоставляемых Python. Файлы CSV широко используются в приложениях, потому что их легко читать и управлять ими, а их небольшой размер делает их относительно быстрыми для обработки и передачи.

Не стесняйтесь, и посмотрите, что у нас есть для продажи и для изучения на рынке, и не стесняйтесь задавать любые вопросы и предоставить свой ценный отзыв, используя канал комментариев ниже.

вся функция работает внутри цикла, и каждая строка должна быть записана в . В моем случае следующая строка перезаписывает существующую строку, и в конце я получаю только одну запись в файле csv, который является последним. Как я могу написать все строки в .

обновление

еще в мои наивные дни я предложил сделать это вручную (это было простое решение простого вопроса), однако из-за этого становится все более популярным, я бы рекомендовал использовать библиотеку CsvHelper что делает все проверки безопасности и т. д.

CSV намного сложнее, чем то, что предлагает вопрос/ответ.

Оригинальный Ответ

поскольку у вас уже есть цикл, рассмотрите делать это так:

или что-то в этом роде. Мое рассуждение: вам не нужно будет писать в файл для каждого элемента, вы будете открывать поток только один раз, а затем писать в него.

вы можете заменить

если вы хотите сохранить предыдущие версии csv в том же файле

редактировать

здесь ссылке на вопрос, который объясняет, что Environment.NewLine тут

я настоятельно рекомендую вам пойти по более утомительному маршруту. Особенно если размер файла большой.

File.AppendAllText() открывает новый файл, записывает содержимое и закрывает файл. Открытие файлов-это более ресурсоемкая операция, чем запись данных в открытый поток. Открытие\закрытие файла внутри цикла приведет к снижению производительности.

подход, предложенный Йоханом, решает эту проблему, сохраняя все выходные данные в памяти, а затем записывая их один раз. Однако (в случае больших файлов), программа будет потреблять большое количество оперативной памяти и даже рухнуть с OutOfMemoryException

Другим преимуществом моего решения является то, что вы можете реализовать приостановку\возобновление, сохранив текущую позицию во входных данных.

upd. Размещено с помощью в нужном месте

запись CSV файлов вручную может быть сложно, потому что ваши данные могут содержать запятые и переносы строк. Я предлагаю вам использовать существующую библиотеку.

в этом вопросе упоминается несколько вариантов.

Я использую решение для двух разборов, так как его очень легко поддерживать

просто используйте AppendAllText вместо:

единственным недостатком AppendAllText является то, что он выдает ошибку, когда файл не существует, поэтому это должно быть проверено

извините, блондинка момент перед чтением документация. Во всяком случае, метод WriteAllText перезаписывает все, что ранее было написано в файле, если файл существует.

обратите внимание, что ваш текущий код не использует правильные новые строки, например в Блокнот вы увидите все это как одну длинную строку. Измените код на это, чтобы иметь правильные новые строки:

вместо вызова каждый раз AppendAllText() вы должны подумать об открытии файла один раз, а затем написать все содержимое один раз:

В этой статье о Python вы узнаете как работать с дробями.

В этой статье по программированию на C++ (также известном как CPP) я покажу вам, как прочитать и обработать файл CSV (значения, разделенные запятыми). Без использования внешних библиотек.

Для этого нам нужно прочитать файл построчно, а затем разбить каждую строку в соответствии с разделителем. Все это мы будем делать с помощью C++ и встроенных функций.

Алгоритм

Давайте сначала проанализируем, что нам нужно сделать. Мы будем читать CSV с помощью C++, поэтому сначала нам нужно открыть файл и прочитать его построчно, поскольку в каждой строке содержится новый набор значений.

В данном случае мы пропустим первую строку, так как она обычно содержит заголовок, но, прочитав ее, мы продолжим читать остальные до конца файла в цикле.

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

CSV файл

Для этого примера я буду использовать CSV, который выглядит следующим образом:


Как видите, у нас есть 4 строки и в каждой из них 7 столбцов.

Важно, чтобы CSV имел определенную и последовательную структуру.

Примечание: мы собираемся прочитать файл и рассматривать все данные как строку. Затем вы можете преобразовать их в double, int и так далее.

Чтение CSV с помощью C++

Теперь давайте посмотрим на код. Сначала мы открываем файл и читаем его:

Внутри цикла у нас появится строка. Пришло время разделить ее для хранения ее значений. Как сказано выше, разделителем является запятая. Далее мы делаем следующее:

Как вы можете видеть, извлечение значений происходит со строки 4 по строку 10, мы читаем из строчки и помещаем каждое значение внутрь каждой переменной. Помните, что они должны располагаться в том же порядке, что и столбцы в CSV-файле.

Полный код выглядит следующим образом:

Вот как использовать C++ для чтения CSV.

Сохраните статью в социальных сетях, чтобы не потерять.

Похожие записи

В стандартной библиотеке у нас есть модуль для чтения файлов csv. Этот модуль не очень…

Kubernetes становится все более популярным средством развертывания приложений, особенно в архитектурах микросервисов. С другой стороны,…

В этой статье о Python мы рассмотрим, как получить наименьшее общее кратное (НОК) двух чисел.…

CSV (comma-separated value) - это формат представления табличных данных (например, это могут быть данные из таблицы или данные из БД).

В этом формате каждая строка файла - это строка таблицы. Несмотря на название формата, разделителем может быть не только запятая.

И хотя у форматов с другим разделителем может быть и собственное название, например, TSV (tab separated values), тем не менее, под форматом CSV понимают, как правило, любые разделители.

Пример файла в формате CSV (sw_data.csv):

В стандартной библиотеке Python есть модуль csv, который позволяет работать с файлами в CSV формате.

Чтение¶

Пример чтения файла в формате CSV (файл csv_read.py):

Вывод будет таким:

В первом списке находятся названия столбцов, а в остальных соответствующие значения.

Обратите внимание, что сам csv.reader возвращает итератор:

При необходимости его можно превратить в список таким образом:

Чаще всего заголовки столбцов удобней получить отдельным объектом. Это можно сделать таким образом (файл csv_read_headers.py):

Иногда в результате обработки гораздо удобней получить словари, в которых ключи - это названия столбцов, а значения - значения столбцов.

Для этого в модуле есть DictReader (файл csv_read_dict.py):

Вывод будет таким:

До Python 3.8 возвращался отдельный тип упорядоченные словари (OrderedDict).

Запись¶

Аналогичным образом с помощью модуля csv можно и записать файл в формате CSV (файл csv_write.py):

В примере выше строки из списка сначала записываются в файл, а затем содержимое файла выводится на стандартный поток вывода.

Вывод будет таким:

Обратите внимание на интересную особенность: строки в последнем столбце взяты в кавычки, а остальные значения - нет.

Так получилось из-за того, что во всех строках последнего столбца есть запятая. И кавычки указывают на то, что именно является целой строкой. Когда запятая находится в кавычках, модуль csv не воспринимает её как разделитель.

Иногда лучше, чтобы все строки были в кавычках. Конечно, в данном случае достаточно простой пример, но когда в строках больше значений, то кавычки позволяют указать, где начинается и заканчивается значение.

Модуль csv позволяет управлять этим. Для того, чтобы все строки записывались в CSV-файл с кавычками, надо изменить скрипт таким образом (файл csv_write_quoting.py):

Теперь вывод будет таким:

Теперь все значения с кавычками. И поскольку номер модели задан как строка в изначальном списке, тут он тоже в кавычках.

Кроме метода writerow, поддерживается метод writerows. Ему можно передать любой итерируемый объект.

Например, предыдущий пример можно записать таким образом (файл csv_writerows.py):

DictWriter¶

С помощью DictWriter можно записать словари в формат CSV.

В целом DictWriter работает так же, как writer, но так как словари не упорядочены, надо указывать явно в каком порядке будут идти столбцы в файле. Для этого используется параметр fieldnames (файл csv_write_dict.py):

Указание разделителя¶

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

Исследование различных веб-технологий, математических алгоритмов и проектирование веб-приложений.

Рубрики

Комменты

В прошлом уроке мы с вами познакомились с грамотными способами чтения и записи файлов в iMacros. Сегодня мы пойдем немного дальше и будем рассматривать формат табличного представления данных CSV. От обычных текстовых файлов их отличает наличие спецификации, то есть четких правил, по которым они должны быть построены. Соблюдение данных правил открывает нам большие возможности, например, такие файлы можно будет открывать в других редакторах, использовать с различным программным обеспечением, которое поддерживает их.

Структура формата CSV

Такой файл легко открывается в Excel(или в OpenOffice) и все значения находятся в своих ячейках таблицы.

iMacros Excel

Аналогично вы можете взять любую экселевскую таблицу(с расширениями .xls или .xlsx) и сохранить ее в формат CSV. Это очень простой формат и он не поддерживает формулы, вычисления и т.д., как полноценные форматы Excel. Однако, бывает очень удобно записывать данные из iMacros и потом обрабатывать их в Excel и, наоборот, брать информацию из Excel и использовать ее в своих скриптах.

Примечание: на самом деле у Excel есть еще XML-формат, который поддерживает формулы, стили оформления и большую часть функционала Excel, он текстовый, а не бинарный, как .xls или .xlsx. Тем не менее, он куда более сложный, нежели CSV и требует более глубоко понимания и навыков в кодинге. Мне доводилось генерировать при помощи JS вывод отчетов с перекрестными формулами в Excel, задача достаточно трудоемкая и времязатратная.

Чтение формата CSV и получение любой ячейки таблицы с помощью iMacros и Javascript

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

Для загрузки файла в переменную, мы используем код для чтения файла из прошлого урока:

Замечательно! Мы получим содержимое файла в виде текста. Это не очень удобно, поэтому преобразуем его в двумерный Javascript-массив.

Вот такой массив я хочу видеть в результате:

В данном случае, у нас получится массив с тремя элементами. Каждым элементом этого массива будет другой массив, состоящий из численных и строковых значений. Если немного подумать, у нас уже есть достаточно знаний для осуществления подобного преобразования.

Парсинг формата CSV

На первый взгляд может показаться, что мы можем тупо использовать 2 раза метод split(), поскольку текст мы можем разбить на массив строк при помощи split('\r\n') , а строку на ячейки при помощи split(',') , поскольку в качестве разделителя у нас используется запятая. Это не совсем так, если у нас в некоторых ячейках будет текст, содержащий в себе запятые, наш алгоритм будет работать неправильно.

Давайте добавим немного запятых в исходные данные(test.csv):

На самом деле ситуаций, когда такой подход со split() не сработает, может быть великое множество, тут и кавычки разных видов, и экранированные символы и т.д. На помощь нам придет один очень популярный скрипт для парсинга CSV в массив.

Итоговый скрипт чтения и парсинга файла формата CSV для iMacros+JS:

В консоли мы видим аккуратно распарсенный массив с нашей таблицей.


Сохранение двумерного Javascript-массива в CSV в iMacros

Считывать содержимое csv-файлов мы научились. Отсюда возникает вопрос, а как же выполнить обратное преобразование массива в текст? На самом деле, тут нету ничего сложного.

Давайте воспользуемся следующей функцией:

Важное примечание: CSV-файлы необязательно должны использовать запятую в качестве разделителя, в большей части мира используется точка с запятой(;).
Excel 2016 корректно работает с вашими региональными настройками и использует тот разделитель, который указан в панели управления в Настройках региона->Дополнительные параметры->Разделитель элементов списков . В Excel 2010 на английской винде, у меня по умолчанию стояла запятая в качестве разделителя, вы его можете поменять. Поэтому, если вдруг вы сгенерировали CSV-файл, а он у вас в Excel открылся в одной ячейке, первым делом проверьте какие разделители вы используете и какие по умолчанию использует ваша операционная система.

Читайте также: