Содержание

Import-CSV: Импорт (чтение) данных из CSV файлов в PowerShell

Для чтения содержимого CSV файла можно использовать PowerShell командлет Import-CSV. После загрузки содержимого CSV файла, вы получаете объект PowerShell, в котором каждая колонка из CSV файла представляет собой отдельное свойство. В этой статье мы рассмотрим особенности использования командлета Import-CSV для чтения данных из CSV.

CSV файл представляет собой форму табличного представления данных. Итак, мы создали в Excel простейшую таблицы с данными пользователей в AD со следующей структурой: ADlogin, Email, Phone, Department . Обратите внимание, что в первой строке таблицы указаны названия столбцов. В PowerShell эти названия будут доступны, как атрибуты объектов в массиве.

Наша задача – импортировать данный CSV файл в PowerShell и внести изменения в Active Directory для каждого логина пользователя из файла.

В предыдущей статье мы рассмотрели, как использовать командлет Export-CSV для выгрузки данных в CSV файлы.

Сохраните данный Excel файл как CSV файл с запятыми в качестве разделителей. Получится вот такой текстовый файл:

Для импорта CSV файла в PowerShell достаточно указать его имя (путь)

$ADUsers=Import-CSV -path C:\PS\my_ad_users.csv

Командлет Import-CSV конвертирует данные из CSV файла в массив PowerShell.

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

Список доступны свойств объекта можно вывести так:

$ADUsers|get-member

Как вы видите, в строках массива содержатся объекты типа

PSCustomObject, к элементам которых можно обращаться по названия столбцов из вашего CSV файла.

Можно вывести все значения из определенного столбца:

$ADusers.email

Или вы можете вывести только определенные свойства объектов:

$ADusers| select Email, Phone

Можно обратится напрямую к определенной строке в массиве. Чтобы получить значение 3 строки, выполните команду (нумерация начинается с 0):

$ADusers[2]

Чтобы внести изменения в атрибуты пользователей Active Directory, которые вы задали в вашем CSV файле нужно с помощью цикла ForEach перебрать все строки в массиве $ADUsers ( для внесения изменений мы используем командлет Set-ADUser из модуля AD PowerShell).

#перебор всех строк в массиве по одному
$ADUsers | ForEach-Object {
# В данном примере строка $_. означает, что мы обращаемся к текущей строке массива. Значение конкретного столбца из текущей строки можно получить, обратившись к нему по имени столбца. Например, чтобы вывести на экран значение ADLogin из текущей строки:
Write-host $_.AdLogin
# Ищем пользователя в AD по значению из столбца ADLogin и меняем значения в его атрибутах из оставшихся столбцов.
Set-ADUser -Identity $_.AdLogin -MobilePhone $_.Phone –Department $_.Department –EmailAddress $_.Email

}

Этот же скрипт можно представить в более компактном виде однострочника PowerShell:

Import-Csv C:\PS\my_ad_users. csv | foreach {Set-ADUser -Identity $_.AdLogin -MobilePhone $_.Phone –Department $_.Department –EmailAddress $_.Email}

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

$ADUsers | add-member -membertype NoteProperty -name Date -value (Get-Date -Format dd/MM/yyyy)

На сайте https://winitpro.ru/ описаны различные сценарии использования командлета Import-CSV для выполнения административных операций с большим количеством объектов:

  • Экспорт содержимого ящиков Exchange в PST файлы по списку пользователей: Import-CSV "C:\ps\user_to_export_pst.csv" | ForEach {New-MailboxExportRequest -Mailbox $_.username -FilePath $_.UNCPathtoPst
  • Добавить пользователей в группу безопасности AD: I mport-CSV .\users.csv -Header users | ForEach-Object {Add-AdGroupMember -Identity ‘TestADGroup’ -members $_. users}
  • Или аналогичный сценарий по добавлению пользователей в группу Azure AD:

    Import-CSV "C:\PS\add_m365_members.csv" | ForEach-Object {
    Add-UnifiedGroupLinks –Identity it_dept –LinkType Members –Links $_.member
    }

  • Выгрузить информацию о пользователях из AD:

    Import-Csv c:\ps\usernsme_list.csv | ForEach {
    Get-ADUser -identity $_.user -Properties Name, telephoneNumber |
    Select Name, telephoneNumber |
    Export-CSV c:\ps\export_ad_list.csv -Append -Encoding UTF8
    }

    Или изменить атрибуты некоторых пользователей через Set-ADUser:

    Import-Csv "C:\ps\modifyad_users.csv" | foreach {Set-ADUser -Identity $_.SamAccountName –Title $_.Title -MobilePhone $_.MobilePhone}

    Обновить фотографию в AD по списку пользователей:

    Import-Csv C:\PS\import.csv |%{Set-ADUser -Identity $_.AD_username -Replace @{thumbnailPhoto=([byte[]](Get-Content $_.Photo -Encoding byte))}}

  • Массово создать учетных записи пользователей в Active Directory по списку из CSV файла.

Импорт и экспорт данных: CSV, копирование таблиц, бэкапы

Импорт CSV-файлов

Импорт данных из файла

Для импорта CSV-файлов есть графический интерфейс. В контекстном меню схемы, в которую вы хотите импортировать, выберите пункт Import From File… Затем выберите сам CSV-файл.

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

В правой части окна опишите таблицу, в которую запишутся данные. Нажмите Delete на столбце, если не хотите его импортировать. Если вы хотите импортировать данные в существующую таблицу, кликните на Import From File…, используя контекстное меню этой таблицы.

В файле данных могут быть ошибки. По умолчанию включен флажок Write error records to file (Записывать ошибки в файл). Процесс импорта не прервется, но создастся журнал с информацией о строках, которые записать не удалось.

Вставка CSV в редактор данных

Вставляйте данные из экселевских таблиц. В общем случае это означает вставку в CSV формате. В DataGrip можно настроить формат, в котором будут записаны данные в буфере обмена. Но IDE может определить его и автоматически: нажмите на шестеренку и выберите значение Paste format.

Редактор CSV

DataGrip умеет редактировать CSV-файлы как таблицы. Для этого выберите Edit As Table из контекстного меню.

Затем укажите разделитель, уточните формат заголовка и т.д. Есть предпросмотр.

Экспорт данных

Что и куда

Таблица

Таблицу можно экспортировать в:
Файл. Контекстное меню таблицы → Dump data to file.
Другую таблицу. Контекстное меню таблицы Copy Table to (или нажать F5 на таблице) → Выбрать существующую таблицу.
Новую таблицу в любой СУБД.

Контекстное меню таблицы Copy Table to (или нажать F5 на таблице) → Выбрать схему или базу данных. Или просто перетащите таблицу мышкой туда, куда хотите экспортировать! На видео показано, как скопировать таблицу из PostgreSQL в SQLite.

SQL-запрос

Запрос может быть экспортирован в файл, то есть результаты сразу запишутся на диск. Для этого вызовите контекстное меню на запросе, выберите Execute to file. Затем укажите формат экспорта. Это особенно полезно, если запрос медленный: для экспорта не нужно запускать его два раза.

Результат запроса

Результат можно экспортировать в:
Файл. Кнопка экспорта → To File.
Буфер обмена. Кнопка экспорта → To Clipboard.
Существующую таблицу. Кнопка копирования → Выберите таблицу.

Новую таблицу в любой СУБД. Кнопка копирования → Выберите схему или базу.

Выделенную область данных

Выделенную область данных можно скопировать в буфер обмена: Ctrl+C или через контекстное меню Copy.

Форматы экспорта

Всякий раз, когда вы экспортируете в файл или буфер обмена, используется определенный формат экспорта. Часто это CSV, но можно использовать и другие, например: JSON, XML, HTML и Markdown. Выберите соответствующий формат в выпадающем списке на панели инструментов или создайте свой собственный.

SQL-запросы

Any table or result-set can be presented as a batch of INSERT statements. Для этого выберите формат SQL Inserts в выпадающем списке. В некоторых случаях это самый быстрый способ перенести данные из одной таблицы в другую. Генератор кода умеет учитывать столбцы с автоинкрементом.

It can be also can be also presented as a batch of UPDATE statements, which can help you to modify data.

CSV, TSV

There are two pre-built formats in the list: Comma Separated Values and Tab Separated Values. Вы можете создать свой формат с любым разделителем. For instance, it can be Confluence Wiki Markup.

HTML и XML

Один из форматов по умолчанию нельзя изменить: HTML table. Другие форматы описаны скриптами: HTML-Groovy.html.groovy, XML-Groovy.xml.groovy и т.д. Эти скрипты называются «экстракторами». Эти скрипты можно модифицировать.

JSON

Экстрактор JSON-Groovy.json.groovy экспортирует данные в формате JSON.

Создание собственных форматов

Для нетривиальных случаев можно писать свои экстракторы. CSV-Groovy.csv.groovy, HTML-Groove.html.groovy — это экстракторы, встроенные в DataGrip по умолчанию. В выпадающем списке выбора форматов/экстракторов выберите Go to scripts directory, чтобы открыть папку, в которой лежат экстракторы.

Экстракторы, то есть скрипты, можно писать на Groovy или JavaScript. Они расположены в Scratches and Consoles/Extensions/Database Tools and SQL/data/extractors. Изменяйте существующие экстракторы или добавляйте свои собственные.

Чтобы узнать больше о написании экстракторов, прочитайте эту статью.

Инструменты для бэкапа

DataGrip поддерживает работу с mysqldump и pg_dump. Чтобы создать копию базы, используйте пункт Dump with… из контекстного меню источника данных. Инструменты восстановления для MySQL и PostgreSQL тоже вызывайте из контекстного меню. Для PostgreSQL можно восстанавливать двумя утилитами: pg_dump или psql. Выберите нужную в диалоговом окне.

Import-Csv (Microsoft.PowerShell.Utility) — PowerShell | Microsoft Learn

  • Справочник
Модуль:
Microsoft.PowerShell.Утилита

Создает табличные настраиваемые объекты из элементов в файле значений, разделенных символами (CSV).

Синтаксис

 Import-Csv
      [[-Разделитель] ]
      [-Путь] <Строка[]>
      [-Заголовок <Строка[]>]
      [-Кодировка <Кодировка>]
      [<Общие параметры>] 
 Импорт-CSV
      [[-Разделитель] ]
      -LiteralPath <Строка[]>
      [-Заголовок <Строка[]>]
      [-Кодировка <Кодировка>]
      [] 
 Import-Csv
      [-Путь] <Строка[]>
      -Использовать культуру
      [-Заголовок <Строка[]>
] [-Кодировка <Кодировка>] []
 Import-Csv
      -LiteralPath <Строка[]>
      -Использовать культуру
      [-Заголовок <Строка[]>]
      [-Кодировка <Кодировка>]
      [<Общие параметры>] 

Описание

Командлет Import-Csv создает табличные настраиваемые объекты из элементов в CSV-файлах. Каждый столбец в файле CSV становится свойством пользовательского объекта, а элементы в строках становятся свойством ценности. Import-Csv работает с любым файлом CSV, включая файлы, созданные с помощью Export-Csv

командлет.

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

Вы также можете использовать командлеты ConvertTo-Csv и ConvertFrom-Csv для преобразования объектов в CSV струны (и обратно). Эти командлеты аналогичны командлетам Export-CSV и Import-Csv , за исключением что они не имеют дело с файлами.

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

Начиная с PowerShell 6.0, Import-Csv теперь поддерживает расширенный формат файла журнала W3C.

Примеры

Пример 1: Импорт объектов процесса

В этом примере показано, как экспортировать, а затем импортировать CSV-файл объектов процесса.

 Процесс получения | Export-Csv -Путь .\Processes.csv
$P = Импорт-CSV-Путь .\Processes.csv
$П | Get-Member
Имя Типа: System.Management.Automation.PSCustomObject
Имя MemberType Определение
---- ---------- ----------
Метод Equals bool Equals (System.Object obj)
Метод GetHashCode int GetHashCode()
GetType Тип метода GetType()
Строка метода ToString ToString()
BasePriority NoteProperty string BasePriority=8
Строка Company NoteProperty Company=Microsoft Corporation
...
$П | Таблица форматов
Имя SI Обрабатывает VM WS PM NPM Путь
---- -- ------- -- -- -- --- ----
ApplicationFrameHost 4 407 2199293489152 15884288 15151104 23792 C:\WINDOWS\system32\ApplicationFrameHost.exe
...
wininit 0 157 21904288 4591616 1630208 10376
winlogon 4 233 2199125549056 7659520 2826240 10992 C:\WINDOWS\System32\WinLogon. exe
WinStore.App 4 846 873435136 33652736 26607616 55432 C:\Program Files\WindowsApps\Microsoft.WindowsStore_11712.1001.13.0_x64__8weky...
WmiPrvSE 0 201 21919392 8830976 3297280 10632 C:\WINDOWS\system32\wbem\wmiprvse.exe
WmiPrvSE 0 407 2199157727232 18509824 12922880 16624 C:\WINDOWS\system32\wbem\wmiprvse.exe
WUDFHost 0 834 2199310204928 51945472 87441408 24984 C:\Windows\System32\WUDFHost.exe 

Командлет Get-Process отправляет объекты процесса по конвейеру в Export-Csv 900 28 . Командлет Export-Csv преобразует объекты процесса в строки CSV и сохраняет строки в Файл процессов.csv. Командлет Import-Csv импортирует строки CSV из файла Processes.csv. Струны сохраняются в $P переменная. Переменная $P отправляется по конвейеру в Командлет Get-Member , отображающий свойства импортированных строк CSV. Переменная $P передается по конвейеру командлету Format-Table и отображает объекты.

Пример 2. Укажите разделитель

В этом примере показано, как использовать параметр Delimiter командлета Import-Csv .

 Процесс получения | Export-Csv -Path .\Processes.csv -Delimiter :
$P = Import-Csv -Путь .\Processes.csv -Разделитель:
$П | Формат-Таблица 

Командлет Get-Process отправляет объекты процесса по конвейеру на Export-Csv . Экспорт-CSV Командлет преобразует объекты процесса в строки CSV и сохраняет строки в файле Processes.csv. Параметр Delimiter используется для указания разделителя двоеточия. Командлет Import-Csv импортирует строки CSV из файла Processes.csv. Строки сохраняются в переменной $P . К $P переменная отправляется по конвейеру в 9Командлет 0027 Format-Table .

Пример 3. Укажите текущий язык и региональные параметры для разделителя

В этом примере показано, как использовать командлет Import-Csv с параметром UseCulture .

 (Get-Culture).TextInfo.ListSeparator
Get-процесс | Export-Csv -Путь .\Processes.csv -UseCulture
Import-Csv -Path .\Processes.csv -UseCulture 

Командлет Get-Culture использует вложенные свойства TextInfo и ListSeparator чтобы получить разделитель списка по умолчанию для текущей культуры. Командлет Get-Process отправляет объекты процесса вниз по трубопровод к Export-Csv . Командлет Export-Csv преобразует объекты процессов в строки CSV и сохраняет строки в файле Processes.csv. Параметр UseCulture использует текущую разделитель списка по умолчанию для культуры. Командлет Import-Csv импортирует строки CSV из Файл процессов.csv.

Пример 4. Изменение имен свойств в импортированном объекте

В этом примере показано, как использовать параметр Header Import-Csv для изменения имен свойства полученного импортированного объекта.

 Start-Job -ScriptBlock { Get-Process } | Export-Csv -Путь .\Jobs.csv -NoTypeInformation
$Header = 'Состояние', 'Дополнительные данные', 'Сообщение о состоянии', 'Местоположение', 'Команда', 'Информация о состоянии', 'Завершено',
          'InstanceId', 'Id', 'Имя', 'ChildJobs', 'BeginTime', 'EndTime', 'JobType', 'Output',
          «Ошибка», «Ход выполнения», «Подробная информация», «Отладка», «Предупреждение», «Информация»
# Удалить заголовок по умолчанию из файла
$A = Get-Content-Path .\Jobs.csv
$A = $A[1..($A.Count - 1)]
$А | Out-File -FilePath .\Jobs.csv
$J = Import-Csv -Путь .\Jobs.csv -Заголовок $Заголовок
$J
Состояние: работает
Дополнительные данные: правда
Статус :
Местоположение: локальный хост
Команда: Получить-Процесс
Информация о состоянии: работает
Завершено: System.Threading.ManualResetEvent
Идентификатор экземпляра: a259eb63-6824-4b97-a033-305108ae1c2e
Идентификатор: 1
Имя: Работа1
Дочерние задания: System.Collections.Generic.List`1[System.Management.Automation. Job]
Время начала : 20.12.2018 18:59:57
Время окончания       :
Тип задания: фоновое задание
Вывод: System.Management.Automation.PSDataCollection`1[System.Management.Automation.PSObject]
Ошибка: System.Management.Automation.PSDataCollection`1[System.Management.Automation.ErrorRecord]
Ход выполнения: System.Management.Automation.PSDataCollection`1[System.Management.Automation.ProgressRecord]
Verbose : System.Management.Automation.PSDataCollection`1[System.Management.Automation.VerboseRecord]
Отладка: System.Management.Automation.PSDataCollection`1[System.Management.Automation.DebugRecord]
Предупреждение: System.Management.Automation.PSDataCollection`1[System.Management.Automation.WarningRecord]
Информация : System.Management.Automation.PSDataCollection`1[System.Management.Automation.InformationRecord] 

Командлет Start-Job запускает фоновое задание, которое запускает Get-Process . Объект задания отправляется вниз конвейер к командлету Export-Csv и преобразован в строку CSV. NoTypeInformation Параметр удаляет заголовок информации о типе из выходных данных CSV и является необязательным в PowerShell v6 и выше. Переменная $Header содержит настраиваемый заголовок, который заменяет следующие значения по умолчанию: Хасморедата , JobStateInfo , PSBeginTime , PSEndTime и PSJobTypeName . $A переменная использует командлет Get-Content для получения строки CSV из файла Jobs.csv. $A переменная используется для удаления заголовка по умолчанию из файла. Командлет Out-File сохраняет новый версия файла Jobs.csv в переменной $A . Командлет Import-Csv импортирует файл Jobs.csv. и использует параметр заголовка для применения Переменная $Header . Переменная $J содержит импортировал PSCustomObject и отображает объект в консоли PowerShell.

Пример 5. Создание настраиваемого объекта с помощью CSV-файла

В этом примере показано, как создать настраиваемый объект в PowerShell с помощью CSV-файла.

 Get-Content-Путь .\Links.csv
113207,about_Aliases
113208, about_Arithmetic_Operators
113209, about_Arrays
113210, about_Assignment_Operators
113212, about_Automatic_Variables
113213,about_Break
113214, about_Command_Precedence
113215, about_Command_Syntax
144309,about_Comment_Based_Help
113216, about_CommonParameters
113217, about_Comparison_Operators
113218,информация_Продолжить
113219, about_Core_Commands
113220, about_Data_Section
$A = Import-Csv -Path .\Links.csv -Header 'LinkID', 'TopicTitle'
$А | Get-Member
Имя Типа: System.Management.Automation.PSCustomObject
Имя MemberType Определение
---- ---------- ----------
Метод Equals bool Equals (System.Object obj)
Метод GetHashCode int GetHashCode()
GetType Тип метода GetType()
Строка метода ToString ToString()
LinkID NoteProperty string LinkID=113207
TopicTitle NoteProperty string TopicTitle=about_Aliases
$А | Where-Object -Property TopicTitle -Like '*псевдоним*'
LinkID Название темы
------ ----------
113207 about_Aliases 

Чтобы создать файл Links. csv, используйте значения, показанные в выходных данных Get-Content .

Командлет Get-Content отображает файл Links.csv. Командлет Import-Csv импортирует файл Links.csv. файл. Параметр Header указывает имена свойств LinkId и TopicTitle . объекты хранятся в переменной $A . Командлет Get-Member показывает имена свойств из Заголовок параметр. Командлет Where-Object выбирает объекты со свойством TopicTitle . который включает псевдоним .

Пример 6. Импорт CSV-файла, в котором отсутствует значение

В этом примере показано, как командлет Import-Csv в PowerShell реагирует на строку заголовка в CSV-файле. файл содержит нулевое или пустое значение. Import-Csv заменяет отсутствующий заголовок именем по умолчанию. строка, которая становится именем свойства объекта, который Import-Csv возвращает.

 Get-Content-Путь .\Projects.csv
ProjectID,ProjectName,Завершено
13, инвентарь, Редмонд, правда
440,Дальний Восток,Правда
469, Маркетинг, Европа, Ложь
Import-Csv -Путь .\Projects.csv
ПРЕДУПРЕЖДЕНИЕ. Один или несколько заголовков не указаны. Имена по умолчанию, начинающиеся с «H», использовались в
место отсутствующих заголовков.
ProjectID ProjectName h2 Завершено
--------- ----------- -- ---------
13 Инвентарь Редмонд Правда
440 Дальний Восток Правда
469 Маркетинговая Европа Ложь
(Импорт-Csv-Путь .\Projects.csv).h2
ПРЕДУПРЕЖДЕНИЕ. Один или несколько заголовков не указаны. Имена по умолчанию, начинающиеся с «H», использовались в
место отсутствующих заголовков.
Редмонд
Дальний Восток
Европа 

Чтобы создать файл Projects.csv, используйте значения, показанные в выходных данных Get-Content примера .

Командлет Get-Content отображает файл Projects.csv. В строке заголовка отсутствует значение между ProjectName и Завершено . Командлет Import-Csv импортирует файл Projects.csv и отображает предупреждающее сообщение, поскольку h2 является именем заголовка по умолчанию. Команда (Import-Csv -Path .\Projects.csv).h2 получает h2 значений свойств и отображает предупреждение.

Параметры

-Разделитель

-Кодировка

-Заголовок

-LiteralPath

-Путь

-UseCulture

90 014 Входные данные

Строка

Можно передать строку, содержащую путь к этому командлету.

Выходные данные

Объект

Этот командлет возвращает объекты, описанные в содержимом CSV-файла.

Примечания

PowerShell включает следующие псевдонимы для Import-Csv :

  • Все платформы:
    • ипксв

Поскольку импортированные объекты являются CSV-версиями типа объекта, они не распознаются и отформатированы с помощью записей форматирования типа PowerShell, которые форматируют версии объекта, отличные от CSV. тип.

Результатом выполнения команды Import-Csv является набор строк, образующих пользовательский объект. Каждая строка представляет собой отдельную строку, поэтому вы можете использовать Count свойство объекта для подсчета строки таблицы. Столбцы — это свойства объекта, а элементы в строках — свойства. ценности.

Строка заголовка столбца определяет количество столбцов и имена столбцов. Имена столбцов также имена свойств объектов. Первая строка интерпретируется как столбец заголовки, если вы не используете параметр Заголовок для указания заголовков столбцов. Если в какой-либо строке больше значений, чем строка заголовка, дополнительные значения игнорируются.

Если в строке заголовка столбца отсутствует значение или содержится нулевое или пустое значение, Import-Csv использует H , за которым следует номер отсутствующего заголовка столбца и имя свойства.

В файле CSV каждый объект представлен списком значений свойств, разделенных символами. объект. Значения свойств преобразуются в строки с помощью метода ToString() класса объекта, поэтому они представлены именем значения свойства. Экспорт-CSV не экспортирует методы объекта.

Import-Csv также поддерживает формат расширенного журнала W3C. Строки, начинающиеся с # , рассматриваются как комментарии и игнорируются, если комментарий не начинается с #Fields: и содержит список столбцов с разделителями имена. В этом случае командлет использует эти имена столбцов. Это стандартный формат для Windows IIS. и другие журналы веб-сервера. Для получения дополнительной информации см. Расширенный формат файла журнала.

  • ConvertFrom-Csv
  • Преобразовать в CSV
  • Экспорт-CSV
  • Get-Культура

csv — Чтение и запись файлов CSV — Документация по Python 3.11.3

Исходный код: Lib/csv.py


Так называемый формат CSV (значения, разделенные запятыми) является наиболее распространенным форматом импорта и формат экспорта для электронных таблиц и баз данных. Формат CSV использовался для многих лет до попыток стандартизированного описания формата в RFC 4180 . Отсутствие четко определенного стандарта означает, что тонкие различия часто существуют в данных, производимых и потребляемых различными приложениями. Эти различия могут затруднить обработку CSV-файлов из нескольких источников. Тем не менее, хотя разделители и символы кавычек различаются, общий формат достаточно похожи, чтобы можно было написать один модуль, который может эффективно манипулировать такими данными, скрывая детали чтения и записи данные от программатора.

Модуль csv реализует классы для чтения и записи табличных данных в CSV. формат. Это позволяет программистам сказать: «Запишите эти данные в предпочтительном формате». Excel» или «прочитать данные из этого файла, созданного Excel», без зная точные детали формата CSV, используемого Excel. Программисты могут также опишите форматы CSV, понятные другим приложениям, или определите их собственные специализированные форматы CSV.

Считыватель модуля csv и записи объектов чтение и писать последовательности. Программисты также могут читать и записывать данные в словарной форме. используя классы DictReader и DictWriter .

См. также

PEP 305 — CSV File API

Предложение по улучшению Python, в котором предлагалось это дополнение к Python.

Содержание модуля

Модуль csv определяет следующие функции:

csv.reader( csvfile , диалект='excel' , **fmtparams )

Вернуть объект чтения, который будет перебирать строки в заданном csvfile . csvfile может быть любым объектом, который поддерживает протокол итератора и возвращает string каждый раз, когда вызывается его метод __next__() — подходят как файловые объекты, так и объекты списка. Если csvfile является файловым объектом, он должен быть открыт с помощью newline='' . 1 Дополнительный диалект параметр может быть задан, который используется для определения набора параметров характерные для конкретного диалекта CSV. Это может быть экземпляр подкласса класс Dialect или одна из строк, возвращаемых функция list_dialects() . Другие необязательные аргументы ключевого слова fmtparams может быть задан для переопределения отдельных параметров форматирования в текущем диалект. Полную информацию о диалекте и параметрах форматирования см. раздел Диалекты и параметры форматирования.

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

Краткий пример использования:

 >>> импортировать csv
>>> с open('eggs.csv', newline='') как csvfile:
... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
. .. для строки в программе чтения спама:
... печать (', '.join (строка))
Спам, Спам, Спам, Спам, Спам, Запеченная фасоль
Спам, прекрасный спам, замечательный спам
 
csv.writer( csvfile , диалект='excel' , **fmtparams )

Возвращает объект записи, ответственный за преобразование данных пользователя в разделители строки в заданном файлоподобном объекте. csvfile может быть любым объектом с метод write() . Если csvfile является файловым объектом, его следует открыть с помощью newline='' 1. Необязательный диалект может быть задан параметр, который используется для определения набора параметров, специфичных для определенный диалект CSV. Это может быть экземпляр подкласса Класс диалекта или одна из строк, возвращенных функция list_dialects() . Другие необязательные аргументы ключевого слова fmtparams может быть задан для переопределения отдельных параметров форматирования в текущем диалект. Полную информацию о диалектах и ​​параметрах форматирования см. раздел Диалекты и параметры форматирования. Сделать это как можно проще взаимодействовать с модулями, которые реализуют DB API, значение Нет записывается как пустая строка. Пока это не обратимое преобразование, упрощает вывод значений данных SQL NULL в CSV-файлы без предварительной обработки данных, возвращенных из cursor.fetch* вызов. Все остальные нестроковые данные преобразуются в строки с помощью str() перед записью.

Краткий пример использования:

 импорт CSV
с open('eggs.csv', 'w', newline='') как csvfile:
    spamwriter = csv.writer (csvfile, разделитель = ' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Спам'] * 5 + ['Запеченные бобы'])
    spamwriter.writerow(['Спам', 'Прекрасный спам', 'Чудесный спам'])
 
csv.register_dialect( имя [ диалект [ **fmtparams ]])

Свяжите диалект с именем . имя должно быть строкой. диалект можно указать либо путем передачи подкласса Dialect , либо по fmtparams ключевых аргумента или и то, и другое, с переопределением ключевых аргументов параметры диалекта. Для получения полной информации о диалектах и ​​форматировании параметры, см. раздел Диалекты и параметры форматирования.

csv.unregister_dialect ( имя )

Удалите диалект, связанный с именем , из реестра диалектов. Ан Ошибка возникает, если имя не является зарегистрированным диалектным именем.

csv.get_dialect( имя )

Вернуть диалект, связанный с именем . Ошибка возникает, если имя не является зарегистрированным диалектным названием. Эта функция возвращает неизменяемый Диалект .

csv.list_dialects()

Вернуть названия всех зарегистрированных диалектов.

csv.field_size_limit([ new_limit ])

Возвращает текущий максимальный размер поля, разрешенный синтаксическим анализатором. Если new_limit есть данный, это становится новым пределом.

Модуль csv определяет следующие классы:

класс csv.DictReader( f , fieldnames=None , restkey=None , restval=None , dialect='excel' , *args , **kwds )

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

Параметр fieldnames представляет собой последовательность. Если имен полей опущены, значения в первой строке файла f будет использоваться в качестве имена полей. Независимо от того, как определяются имена полей, словарь сохраняет их первоначальный порядок.

Если в строке больше полей, чем имен полей, оставшиеся данные помещаются в список и сохраняется с именем поля, указанным клавишей покоя (по умолчанию до Нет ). Если в непустой строке меньше полей, чем имен полей, пропущенные значения заполняются значением restval (которое по умолчанию до Нет ).

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

Изменено в версии 3.6: возвращаемые строки теперь имеют тип OrderedDict .

Изменено в версии 3.8: возвращаемые строки теперь имеют тип dict .

Краткий пример использования:

 >>> импортировать csv
>>> с open('names.csv', newline='') как csvfile:
... читатель = csv.DictReader (csvfile)
... для строки в читателе:
... print(строка['first_name'], строка['last_name'])
...
Эрик Айдл
Джон Клиз
>>> печать (строка)
{'first_name': 'Джон', 'last_name': 'Клиз'}
 
class csv. DictWriter( f , имена полей , restval='' , extrasaction='raise' , диалект='excel' , 9039 3 *args , **kwds )

Создайте объект, который работает как обычный писатель, но сопоставляет словари на выходные строки. Параметр fieldnames представляет собой последовательность ключей, определяющих порядок, в котором значения в словарь перешел на writerow() метод записывается в файл ф . Необязательный параметр restval указывает значение, пишется, если в словаре отсутствует ключ в именах полей . Если словарь, переданный методу writerow() , содержит ключ, не найденный в fieldnames , необязательный параметр extrasaction указывает, какое действие следует брать. Если установлено значение 'raise' , значение по умолчанию, ValueError Поднялся. Если он установлен на 'игнорировать' , лишние значения в словаре игнорируются. Любые другие необязательные или ключевые аргументы передаются базовому писатель экземпляр.

Обратите внимание, что в отличие от класса DictReader параметр fieldnames класса DictWriter не является обязательным.

Краткий пример использования:

 импорт CSV
с open('names.csv', 'w', newline='') как csvfile:
    имена полей = ['first_name', 'last_name']
    писатель = csv.DictWriter (csvfile, имена полей = имена полей)
    писатель.writeheader()
    Writer.writerow({'first_name': 'Запеченный', 'last_name': 'Бобы'})
    author.writerow({'first_name': 'Прекрасный', 'last_name': 'Спам'})
    Writer.writerow({'first_name': 'Замечательно', 'last_name': 'Спам'})
 
класс csv. Диалект

Класс Dialect — это класс-контейнер, атрибуты которого содержат информация о том, как обрабатывать двойные кавычки, пробелы, разделители и т. д. Из-за отсутствия строгой спецификации CSV различные приложения производят слегка отличающиеся данные CSV. Экземпляры диалекта определяют, как читатель и писатель ведут себя экземпляры.

Все доступные имена Диалект возвращаются 9

класс csv.excel

Класс excel определяет обычные свойства файла CSV, созданного в Excel файл. Он зарегистрирован с диалектным именем 'excel' .

класс csv.excel_tab

Класс excel_tab определяет обычные свойства сгенерированного Excel Файл с разделителями TAB. Он зарегистрирован с диалектным именем 'excel-tab' .

класс csv.unix_dialect

Класс unix_dialect определяет обычные свойства файла CSV генерируется в системах UNIX, т. е. с использованием '\n' в качестве разделителя строки и заключения в кавычки все поля. Он зарегистрирован с именем диалекта 'unix' .

Новое в версии 3.2.

класс csv.Sniffer

Класс Sniffer используется для определения формата файла CSV.

Класс Sniffer предоставляет два метода:

sniff( образец , разделители=Нет )

Проанализируйте данный образец и верните подкласс Диалект отражающие найденные параметры. Если необязательный параметр разделителей дан, он интерпретируется как строка, содержащая возможные допустимые символы-разделители.

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

Выбирается двадцать строк после первой строки; если больше половины столбцов + строки соответствуют критериям, возвращается True .

Примечание

Этот метод является грубой эвристикой и может давать как ложные срабатывания, так и негативы.

Пример для Sniffer используйте:

 с open('example.csv', newline='') как csvfile:
    диалект = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    читатель = csv.reader (csvfile, диалект)
    # ... обработать содержимое файла CSV здесь ...
 

Модуль csv определяет следующие константы:

csv.QUOTE_ALL

Инструктирует записывающих объектов заключать в кавычки все поля.

csv.QUOTE_MINIMAL

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

csv.QUOTE_NONNUMERIC

Инструктирует записывающих объектов заключать в кавычки все нечисловые поля.

Указывает читателю преобразовать все поля без кавычек в тип float .

csv.QUOTE_NONE

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

Указывает считывателю не выполнять специальную обработку символов кавычек.

Модуль csv определяет следующее исключение:

исключение CSV.Ошибка

Вызывается любой из функций при обнаружении ошибки.

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

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

Диалекты поддерживают следующие атрибуты:

Диалект.разделитель

Односимвольная строка, используемая для разделения полей. По умолчанию это ',' .

Диалект.двойная кавычка

Управляет тем, как экземпляры quotechar , появляющиеся внутри поля, должны себя цитировать. Когда True , символ удваивается. Когда False , escapechar используется в качестве префикса для кавычек . Это по умолчанию True .

На выходе, если двойная кавычка равна False и не установлен управляющий символ , Ошибка возникает, если в поле найдена кавычка .

Диалект.escapechar

Строка из одного символа, используемая модулем записи для выхода из разделителя , если цитирует устанавливается в QUOTE_NONE и кавычка , если двойная кавычка Ложь . При чтении escapechar удаляет любое специальное значение из следующий персонаж. По умолчанию это None , что отключает экранирование.

Изменено в версии 3.11: Пустой управляющий символ не допускается.

Диалект.lineterminator

Строка, используемая для завершения строк, созданных модулем записи . По умолчанию до '\r\n' .

Примечание

Считыватель жестко закодирован для распознавания '\r' или '\n' как конец строки и игнорирует признак конца строки . Это поведение может измениться в будущее.

Диалект. quotechar

Односимвольная строка, используемая для заключения в кавычки полей, содержащих специальные символы, например как разделитель или кавычек , или которые содержат символы новой строки. Это по умолчанию '"' .

Изменено в версии 3.11: Пустая кавычка не допускается.

Диалект.цитирование

Определяет, когда цитаты должны создаваться автором и распознаваться читатель. Он может принимать любую из констант QUOTE_* (см. раздел Module Contents) и по умолчанию QUOTE_MINIMAL .

Диалект.skipinitialspace

Когда True , пробелы сразу после разделителя игнорируются. По умолчанию Ложь .

Диалект.строгий

Когда True , возникает исключение Ошибка при неправильном вводе CSV. По умолчанию Ложь .

Объекты чтения

объектов Reader ( DictReader экземпляров и объектов, возвращенных функция reader() ) имеют следующие общедоступные методы:

csvreader.__next__()

Вернуть следующую строку итерируемого объекта считывателя в виде списка (если объект был возвращен из reader() ) или dict (если это DictReader экземпляр), проанализированный в соответствии с текущим диалектом . Обычно вы следует вызывать это как next(reader) .

Объекты Reader имеют следующие общедоступные атрибуты:

csvreader.dialect

Доступное только для чтения описание диалекта, используемого синтаксическим анализатором.

csvreader.line_num

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

Объекты DictReader имеют следующий общедоступный атрибут:

DictReader.fieldnames

Если этот атрибут не передается в качестве параметра при создании объекта, этот атрибут инициализируется при первом доступе или при чтении первой записи из файл.

Объекты записи

Writer объектов ( DictWriter экземпляров и объектов, возвращенных функция Writer() ) имеют следующие общедоступные методы. А строка должна быть итерация строк или чисел для объектов Writer и словарь сопоставление имен полей со строками или числами (передавая их через str() первый) для объектов DictWriter . Обратите внимание, что комплексные числа записываются в окружении скобок. Это может вызвать некоторые проблемы для других программ, которые читать файлы CSV (при условии, что они вообще поддерживают комплексные числа).

csvwriter.writerow( строка )

Напишите строка параметра файлового объекта записи, отформатированного в соответствии с к текущему диалекту . Возвращает возвращаемое значение вызова в запись метода базового файлового объекта.

Изменено в версии 3.5: Добавлена ​​поддержка произвольных итераций.

csvwriter.writerows ( строки )

Записать все элементы в строки (итерация из строк объектов, как описано выше) в файловый объект писателя, отформатированный в соответствии с текущим диалект.

Объекты Writer имеют следующий общедоступный атрибут:

csvwriter.dialect

Доступное только для чтения описание диалекта, используемого писателем.

Объекты DictWriter имеют следующий общедоступный метод:

Напишите строку с именами полей (как указано в конструкторе) в файловый объект писателя, отформатированный в соответствии с текущим диалектом. Возвращаться возвращаемое значение csvwriter.writerow() 9Вызов 0028 используется для внутреннего использования.

Новое в версии 3. 2.

Изменено в версии 3.8: writeheader() теперь также возвращает значение, возвращаемое метод csvwriter.writerow() , который он использует внутри.

Примеры

Самый простой пример чтения файла CSV:

 импорт CSV
с open('some.csv', newline='') как f:
    читатель = csv.reader(f)
    для строки в читателе:
        печать (строка)
 

Чтение файла в альтернативном формате:

 импорт CSV
с open('passwd', newline='') как f:
    читатель = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    для строки в читателе:
        печать (строка)
 

Соответствующий простейший пример написания:

 импорт CSV
с open('some.csv', 'w', newline='') как f:
    писатель = csv.writer (f)
    писатель.writerows (некоторый вариант)
 

Поскольку open() используется для открытия файла CSV для чтения, файл по умолчанию будет декодироваться в юникод с использованием системного значения по умолчанию кодирование (см. locale.getencoding() ). Чтобы декодировать файл используя другую кодировку, используйте аргумент encoding для open:

 импорт CSV
с open('some.csv', newline='', encoding='utf-8') как f:
    читатель = csv.reader(f)
    для строки в читателе:
        печать (строка)
 

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

Регистрация нового диалекта:

 импорт CSV
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
с open('passwd', newline='') как f:
    читатель = csv.reader(f, 'unixpwd')
 

Чуть более продвинутое использование считывателя — отлов и сообщение об ошибках:

 импорт CSV, sys
имя файла = 'some.csv'
с открытым (имя файла, новая строка = '') как f:
 читатель = csv.reader(f)
 пытаться:
 для строки в читателе:
 печать (строка)
 кроме csv.Error как e:
 sys.