Чтение и запись данных в формате CSV на языке Python (по материалам Р. А. Сузи)

Опубликовано пользователем Бессонов Л.В. 10.03.2015г.

Файл в формате CSV (commaseparated values значения, разделенные запятыми) универсальное средство для переноса табличной информации между приложениями (электронными таблицами, СУБД, адресными книгами и т.п.). К сожалению, формат файла не имеет строго определенного стандарта, поэтому между файлами, порождаемыми различными приложениями, существуют некоторые тонкие различия. Внутри файл выглядит примерно так (файл pr.csv):
  1. name,number,text
  2. a,1,something here
  3. b,2,"one, two, three"
  4. c,3,"no commas here"
Для работы с CSVфайлами имеются две основные функции:
  1. reader(csvfile[, dialect='excel'[, fmtparam]])
Возвращает читающий объект, который является итератором по всем строкам заданного файла. В качестве csvfile может выступать любой объект, который поддерживает протокол итератора и возвращает строку при обращении к его методу next(). Необязательный аргумент dialect, по умолчанию равный 'excel', указывает на необходимость использования того или иного набора свойств. Узнать доступные варианты можно с помощью csv.list_dialects(). Аргумент может быть одной из строк, возвращаемых указанной функцией, либо экземпляром подкласса класса csv.Dialect. Необязательный аргумент fmtparam служит для переназначения отдельных свойств по сравнению с заданным параметром dialect набором. Все получаемые данные являются строками.
  1. writer(csvfile[, dialect='excel'[, fmtparam]])
Возвращает пишущий объект для записи пользовательских данных с использованием разделителя в заданный файлоподобный объект. Параметры dialect и fmtparam имеют тот же смысл, что и выше. Все данные, кроме строк, обрабатывают функцией str() перед помещением в файл. В следующем примере читается CSVфайл и записывается другой, где числа второго столбца увеличены на единицу:
  1. import csv
  2.  
  3. input_file = open("pr.csv", "rb")
  4. rdr = csv.reader(input_file)
  5. output_file = open("pr1.csv", "wb")
  6. wrtr = csv.writer(output_file)
  7. for rec in rdr:
  8.  
  9. try:
  10.  
  11. rec[1] = int(rec[1]) + 1
  12.  
  13. except:
  14.  
  15. pass
  16.  
  17. wrtr.writerow(rec)
  18. input_file.close()
  19. output_file.close()
В результате получится файл pr1.csv следующего содержания:
  1. name,number,text
  2. a,2,something here
  3. b,3,"one, two, three"
  4. c,4,no commas here
Модуль также определяет два класса для более удобного чтения и записи значений с использованием словаря. Вызовы конструкторов следующие:
  1. class DictReader(csvfile, fieldnames[, restkey=None[, restval=None[, dialect='excel']]]])
Создает читающий объект, подобный тому, что рассматривался выше, но помещающий считываемые значения в словарь. Параметры csvfile и dialect те же, что и раньше. Параметр fieldnames задает имена полей списком. Параметр restkey задает значение ключа для помещения списка значений, для которых не хватило имен полей. Параметр restval используется как значение в том случае, если в записи не хватает значений для всех полей. Если параметр fieldnames не задан, имена полей будут прочитаны.

Баннер SGU.RU