Играйте с файлами csv с помощью python: модуль csv

Python

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

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

В модуле csv в основном есть два способа доступа к файлам csv: методы функций и методы класса.

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

1. Метод функций (метод списка)

csv.reader(f [ dialect='excel'][необязательный kwargs]) #Возвращает считыватель csv (фактически итератор, с методами __next__(), __iter__()), который может читать содержимое файла csv по итерации . f — файловый объект для открытия CSV-файла, обратите внимание, чтоИзмеренный файл следует открывать в текстовом режиме (r или rt), а не в двоичном режиме официального документа.(сообщит об ошибке _csv.Error: итератор должен возвращать строки, а не байты (вы открыли файл в текстовом режиме?)). Диалект определяет набор атрибутов, используемый для анализа CSV-файлов, и указанные атрибуты также можно изменить с помощью параметров ключевого слова.Ниже приводится подробное введение и примеры.

csv.writer(f [ dialect='excel'][необязательный kwargs]) #Возврат к средству записи csv, которое может записывать объекты последовательности (список и т. д.) в файлы csv, а методы записи: writerow(), writerows ( ), представленный в примере. f - объект файла csv, который нужно записать, аналогично,Измеренный файл должен быть открыт в текстовом режиме (w или wt), а не в двоичном режиме официального документа..

l = []
with open('test1.csv','rt') as f: 
   cr = csv.reader(f)
   for row in cr:
       print(row)
       l.append(row) #将test.csv内容读入列表l,每行为其一个元素,元素也为list
with open('1.csv','wt') as f2:
   cw = csv.writer(f2)
   #采用writerow()方法
   for item in l:
      cw.writerow(item) #将列表的每个元素写到csv文件的一行
   #或采用writerows()方法
   #cw.writerows(l) #将嵌套列表内容写入csv文件,每个外层元素为一行,每个内层元素为一个数据
test1.csv
1.csv

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

Во-вторых, метод класса (метод dict)

csv.DictReader(f, fieldnames=None, restkey=None, restval=None, диалект='excel', *args, **kwds) #buildпохожий на словарьcsv-ридер (итератор). f — файловый объект для открытия CSV-файла, аналогично,Файлы измерений следует открывать в текстовом режиме (r или rt).имена полей (список и т. д.) — ключевое значение словаря (Эквивалент заголовков столбцов), каждый ключ соответствует столбцу в файле csv, если он не указан, ключом является элемент в первой строке файла, прочитанный по умолчанию.

csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds) #Создайте средство записи csv, похожее на словарь, с помощью writeheader(),writerrow(rowdict), метод writerows(rowdicts). f — объект типа файла, который может быть файловым объектом, открывающим CSV-файл (w или режим wt открыт). имена полей (список и т. д.) — ключевое значение словаря (заголовок столбца), каждый ключ соответствует столбцу в файле csv,должен быть указан.

l = []
with open('test2.csv','rt') as f: 
   cr = csv.DictReader(f)
   for row in cr:
       print(row)
       l.append(row) #将test2.csv内容读入列表l,每行为其一个元素,元素为dict
                     #key为标题(未指定时为读取的第一行),value为对应列的数据
with open('2.csv','wt') as f2:
   cw = csv.DictWriter(f2,fieldnames=['标题%d' % i for i in range(1,7)])
   cw.writeheader() #将fieldnames写入标题行
   #采用writerow()方法
   for rowdict in l:
      cw.writerow(rowdict) #将列表的每个元素(dict)按照对应的键值对写到csv文件的一行
   #或采用writerows()方法
   #cw.writerows(l) #将dict组成的list整体写入csv文件,每个dict为一行,每个value为一个数据
test2.csv
2.csv

Примечание. 2.csv также имеет проблему с пустыми строками.

Три, набор атрибутов CSV-файла

Диалект набора атрибутов (также называемый «диалектом» ^_^) CSV-файла требуется для записи и чтения CSV-файла, который в основном включает:

  • Разделитель-разделитель (самый важный). Используется для разделения данных в одной строке, обычно запятая (','), также полезна табуляция ('\t').
  • символ новой строки (тоже важно). Данные, используемые для различения разных строк, обычно '\r\n' (Из-за операционной системы, когда символ новой строки записывается в csv, это может привести к появлению дополнительной пустой строки между каждой строкой данных.Подробности см. в примере выше.), '\n' также полезен.
  • Символ кавычки кавычка. Используется для заключения в кавычки областей, содержащих специальные символы, такие как разделители, кавычки, символы новой строки, обычно двойные кавычки ('"').
  • Escape-символ escapechar. Он используется для пропуска разделителя после escape-символа, когда для цитирования установлено значение QUOTE_NONE (то есть разделитель не используется как разделитель, а читается как содержимое), а когда для двойной кавычки установлено значение False, пропускается символ цитирования после символа кавычек. escape-символ (То есть ссылочный символ читается не как ссылочный, а как содержимое).Подобно python'\', может быть установлен любой символ (см. пример ниже).
  • Режим цитирования цитирование. Задает выражение специальных символов.
    • 0 означает csv.QUOTE_MINIMAL (минимальная котировка, csv, сгенерированный Excel).
    • 1 означает csv.QUOTE_ALL (цитировать все, csv, сгенерированный Unix).
    • 2 означает QUOTE_NONNUMERIC (кавычки, а не число).
    • 3 означает csv.QUOTE_NONE (без кавычек, что означает, что специальные символы не заключены в кавычки).
  • Символ кавычек, заключающий в двойные кавычки. Указывает, как ссылаться на сам ссылочный символ.
    • True означает использование формы с двойными кавычками ("""').
    • False означает, что он находится в форме escape-символа перед кавычками (например, '\"'. Примечание. Если escapechar не установлен одновременно, будет сообщено об ошибке).
  • Включить ли строгий режим strict. Если оно равно True, будет сообщено об ошибке, если формат прочитанного CSV-файла будет относительно плохим. Обычно используется значение False по умолчанию.

Модуль csv уже имеет 3 встроенных набора свойств:

  • csv.excel: формат Excel с разделителями-запятыми csv
    • delimiter = ','
    • doublequote = True
    • lineterminator = '\r\n'
    • quotechar = '"'
    • quoting = 0
    • skipinitialspace = False
    • escapechar = None
  • csv.excel_tab: csv в формате Excel с разделителями табуляции
    • delimiter = '\t' #За исключением разделителя, остальные наследуются от класса csv.excel
  • csv.unix_dialect: csv в формате Unix с разделителями-запятыми.
    • delimiter = ','
    • doublequote = True
    • lineterminator = '\n'
    • quotechar = '"'
    • quoting = 1
    • skipinitialspace = False
    • escapechar = None

Кроме того, пользователи сами могут регистрировать новые наборы атрибутов через csv.register_dialect() или, проще говоря, при вызове команд чтения и записи csv,Укажите атрибуты напрямую через аргументы ключевого слова.

В-четвертых, проблема с пустой строкой при записи csv (пример новой строки)

Оглядываясь назад на первый и второй разделы, все записанные CSV-файлы содержат пустые строки между строками данных. Это связано с тем, что используется набор свойств csv.excel по умолчанию, а символ новой строки — '\r\n'. Из-за операционной системы символ новой строки может привести к появлению дополнительной пустой строки между каждой строкой данных при записи в csv..

Решение этой проблемы очень простое: при вызове csv-записи вы можете напрямую указать символ новой строки как '\r' или '\n'.

l = []
with open('test1.csv','rt') as f: 
   cr = csv.reader(f)
   for row in cr:
       print(row)
       l.append(row) #将test.csv内容读入列表l,每行为其一个元素,元素也为list
with open('1a.csv','wt') as f2:
   cw = csv.writer(f2, lineterminator = '\n')
   #采用writerow()方法
   for item in l:
      cw.writerow(item) #将列表的每个元素写到csv文件的一行
   #或采用writerows()方法
   #cw.writerows(l) #将嵌套列表内容写入csv文件,每个外层元素为一行,每个内层元素为一个数据
1a.csv

5. Примеры escape-символов

В третьем разделе представлена ​​функция escape-символа, а ниже приведен пример для демонстрации.

l = []
with open('test1.csv','rt') as f: 
   cr = csv.reader(f)
   print(cr.__next__())

В приведенной выше программе без escape-символов будет выведено: ['1', '2', '3', '4', '5', '6'].

l = []
with open('test1.csv','rt') as f: 
   cr = csv.reader(f, escapechar = '3')
   print(cr.__next__())

В приведенной выше программе символ «3» установлен в качестве escape-символа, и вывод будет: ['1', '2',',4', '5', '6'].

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