Листинг
>>> codecs.BOM_LE
'\xff\xfe'
Для преобразования строки в Unicode необходимо знать, в какой кодировке закодирован текст. Предположим, что это cp1251. Тогда преобразовать текст в Unicode можно следующим способом:
Листинг
>>> s = «Строка в cp1251»
>>> s.decode(«cp1251»)
u'\u0421\u0442\u0440\u043e\u043a\u0430 \u0432 cp1251'
То же самое с помощью встроенной функции unicode():
Листинг
>>> unicode(s, 'cp1251')
u'\u0421\u0442\u0440\u043e\u043a\u0430 \u0432 cp1251'
Одной из полезных функций этого модуля является функция codecs.open(), позволяющая открыть файл в другой кодировке:
Листинг
codecs.open(filename, mode[, enc[, errors[, buffer]]])
Здесь:
Листинг
filename
Имя файла.
Листинг
mode
Режим открытия файла
Листинг
enc
Кодировка.
Листинг
errors
Режим реагирования на ошибки кодировки ('strict' - возбуждать исключение, 'replace' - заменять отсутствующие символы, 'ignore' - игнорировать ошибки).
Листинг
buffer
Режим буферизации (0 — без буферизации, 1 — построчно, n — байт буфера).
Заключение
В этой лекции были рассмотрены основные типы для манипулирования текстом: строки и Unicode–строки. Достаточно подробно описаны регулярные выражения — один из наиболее эффективных механизмов для анализа текста. В конце приведены некоторые функции для работы с Unicode.
7. Лекция: Работа с данными в различных форматах.
Работа с современными форматами данных — одно из сильных мест стандартной библиотеки Python. В этой лекции будут рассмотрены типичные для Python подходы к чтению, преобразованию и записи информации в требуемых форматах. В настоящее время разработано и доступно в Интернете большое количество модулей для всевозможных форматов данных.
Формат CSV
Файл в формате CSV (comma–separated values — значения, разделенные запятыми) - универсальное средство для переноса табличной информации между приложениями (электронными таблицами, СУБД, адресными книгами и т.п.). К сожалению, формат файла не имеет строго определенного стандарта, поэтому между файлами, порождаемыми различными приложениями, существуют некоторые тонкие различия. Внутри файл выглядит примерно так (файл pr.csv):
Листинг
name,number,text
a,1,something here
b,2,«one, two, three»
c,3,«no commas here»
Для работы с CSV–файлами имеются две основные функции:
Листинг
reader(csvfile[, dialect='excel'[, fmtparam]])
Возвращает читающий объект, который является итератором по всем строкам заданного файла. В качестве csvfile может выступать любой объект, который поддерживает протокол итератора и возвращает строку при обращении к его методу next(). Необязательный аргумент dialect, по умолчанию равный 'excel', указывает на необходимость использования того или иного набора свойств. Узнать доступные варианты можно с помощью csv.list_dialects(). Аргумент может быть одной из строк, возвращаемых указанной функцией, либо экземпляром подкласса класса csv.Dialect. Необязательный аргумент fmtparam служит для переназначения отдельных свойств по сравнению с заданным параметром dialect набором. Все получаемые данные являются строками.
Листинг
writer(csvfile[, dialect='excel'[, fmtparam]])
Возвращает пишущий объект для записи пользовательских данных с использованием разделителя в заданный файлоподобный объект. Параметры dialect и fmtparam имеют тот же смысл, что и выше. Все данные, кроме строк, обрабатывают функцией str() перед помещением в файл.
В следующем примере читается CSV–файл и записывается другой, где числа второго столбца увеличены на единицу:
Листинг
import csv
input_file = open(«pr.csv», «rb»)
rdr = csv.reader(input_file)
output_file = open(«pr1.csv», «wb»)
wrtr = csv.writer(output_file)
for rec in rdr:
try:
rec[1] = int(rec[1]) + 1
except:
pass
wrtr.writerow(rec)
input_file.close()
output_file.close()
В результате получится файл pr1.csv следующего содержания:
Листинг
name,number,text
a,2,something here
b,3,«one, two, three»
c,4,no commas here
Модуль также определяет два класса для более удобного чтения и записи значений с использованием словаря. Вызовы конструкторов следующие:
Листинг
class DictReader(csvfile, fieldnames[, restkey=None[, restval=None[, dialect='excel']]]])
Создает читающий объект, подобный тому, что рассматривался выше, но помещающий считываемые значения в словарь. Параметры csvfile и dialect те же, что и раньше. Параметр fieldnames задает имена полей списком. Параметр restkey задает значение ключа для помещения списка значений, для которых не хватило имен полей. Параметр restval используется как значение в том случае, если в записи не хватает значений для всех полей. Если параметр fieldnames не задан, имена полей будут прочитаны из первой записи CSV–файла. Начиная с Python 2.4, параметр fieldnames необязателен. Если он отсутствует, ключи берутся из первой строки CSV–файла.
Читать дальше