I am trying to create a duplicate CSV without a header. When I attempt this I get the following error:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 1895: invalid start byte.
I’ve read the python CSV documentation on Unicode and UTF-8 encoding and have implemented it.
However, my output file is being generated with no data in it. Not sure what I am doing wrong here.
import csv
path = '/Users/johndoe/file.csv'
with open(path, 'r') as infile, open(path + 'final.csv', 'w') as outfile:
def unicode_csv(infile, outfile):
inputs = csv.reader(utf_8_encoder(infile))
output = csv.writer(outfile)
for index, row in enumerate(inputs):
yield [unicode(cell, 'utf-8') for cell in row]
if index == 0:
continue
output.writerow(row)
def utf_8_encoder(infile):
for line in infile:
yield line.encode('utf-8')
unicode_csv(infile, outfile)
asked Sep 4, 2015 at 17:04
user3062459user3062459
1,5677 gold badges26 silver badges39 bronze badges
The solution was to simply include two additional parameters to the
with open(path, 'r') as infile:
The two parameters are encoding =’UTF-8′ and errors=’ignore’. This allowed me to create a duplicate of original CSV without the headers and without the UnicodeDecodeError. Below is the completed code.
import csv
path = '/Users/johndoe/file.csv'
with open(path, 'r', encoding='utf-8', errors='ignore') as infile, open(path + 'final.csv', 'w') as outfile:
inputs = csv.reader(infile)
output = csv.writer(outfile)
for index, row in enumerate(inputs):
# Create file with no header
if index == 0:
continue
output.writerow(row)
answered Sep 5, 2015 at 2:08
user3062459user3062459
1,5677 gold badges26 silver badges39 bronze badges
Since the line
unicode_csv(infile,outfile)
isn’t indented, it is out of the scope of the with command, and when it called, then infile and outfile are both closed.
The files should be opened when they are used, not when the functions are defined, so have:
with open(path, 'r') as infile, open(path + 'final.csv', 'w') as outfile:
unicode_csv(infile,outfile)
answered Sep 4, 2015 at 19:39
James KJames K
3,6521 gold badge29 silver badges36 bronze badges
If you are able to use pandas, and you know the exact encoding of your file, you could try this:
import pandas as pd
path = '/Users/johndoe/file.csv'
df = pd.read_csv(path, encoding='ISO-8859-1')
df.to_csv(path, encoding='utf-8', index=False)
answered May 18, 2020 at 10:37
I can’t create an utf-8 csv file in Python.
I’m trying to read it’s docs, and in the examples section, it says:
For all other encodings the following
UnicodeReader and UnicodeWriter
classes can be used. They take an
additional encoding parameter in their
constructor and make sure that the
data passes the real reader or writer
encoded as UTF-8:
Ok. So I have this code:
values = (unicode("Ñ", "utf-8"), unicode("é", "utf-8"))
f = codecs.open('eggs.csv', 'w', encoding="utf-8")
writer = UnicodeWriter(f)
writer.writerow(values)
And I keep getting this error:
line 159, in writerow
self.stream.write(data)
File "/usr/lib/python2.6/codecs.py", line 686, in write
return self.writer.write(data)
File "/usr/lib/python2.6/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 22: ordinal not in range(128)
Can someone please give me a light so I can understand what the hell am I doing wrong since I set all the encoding everywhere before calling UnicodeWriter class?
class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
# Redirect output to a queue
self.queue = cStringIO.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)()
def writerow(self, row):
self.writer.writerow([s.encode("utf-8") for s in row])
# Fetch UTF-8 output from the queue ...
data = self.queue.getvalue()
data = data.decode("utf-8")
# ... and reencode it into the target encoding
data = self.encoder.encode(data)
# write to the target stream
self.stream.write(data)
# empty queue
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)
I can’t create an utf-8 csv file in Python.
I’m trying to read it’s docs, and in the examples section, it says:
For all other encodings the following
UnicodeReader and UnicodeWriter
classes can be used. They take an
additional encoding parameter in their
constructor and make sure that the
data passes the real reader or writer
encoded as UTF-8:
Ok. So I have this code:
values = (unicode("Ñ", "utf-8"), unicode("é", "utf-8"))
f = codecs.open('eggs.csv', 'w', encoding="utf-8")
writer = UnicodeWriter(f)
writer.writerow(values)
And I keep getting this error:
line 159, in writerow
self.stream.write(data)
File "/usr/lib/python2.6/codecs.py", line 686, in write
return self.writer.write(data)
File "/usr/lib/python2.6/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 22: ordinal not in range(128)
Can someone please give me a light so I can understand what the hell am I doing wrong since I set all the encoding everywhere before calling UnicodeWriter class?
class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
# Redirect output to a queue
self.queue = cStringIO.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)()
def writerow(self, row):
self.writer.writerow([s.encode("utf-8") for s in row])
# Fetch UTF-8 output from the queue ...
data = self.queue.getvalue()
data = data.decode("utf-8")
# ... and reencode it into the target encoding
data = self.encoder.encode(data)
# write to the target stream
self.stream.write(data)
# empty queue
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)
Программисты часто сталкиваются с задачей обработки больших объемов структурированных данных. Python имеет встроенную библиотеку CSV, с помощью которой программист может работать со специальными CSV файлами. Это своего рода электронные таблицы.
Что такое файлы CSV
Файл CSV – это особый вид файла, который позволяет структурировать большие объемы данных.
По сути, он является обычным текстовым файлом, однако каждый новый элемент отделен от предыдущего запятой или другим разделителем. Обычно каждая запись начинается с новой строки. Данные CSV можно легко экспортировать в электронные таблицы или базы данных. Программист может расширять CSV файл, добавляя новые строки.
Пример CSV файла, где в качестве разделителя используется запятая:
Имя,Профессия,Год рождения Виктор,Токарь, 1995 Сергей,Сварщик,1983
Как видно из примера, в первой строке обычно указывается, какая информация будет находиться в каждом столбце. Кроме того, после последнего элемента строки запятая не ставиться, интерпретатор определяет конец строки по символу переноса.
Вместо запятой можно использовать любой другой разделитель, поэтому при чтении CSV файла нужно заранее знать, какой символ используется.
Важно помнить, что CSV – это обычный текстовый файл, который не поддерживает символы в кодировках, отличающихся от ASCII или Unicode.
Библиотека CSV
Эта основная библиотека для работы с CSV файлами в Python.
Библиотека csv является встроенной, поэтому её не нужно скачивать, достаточно использовать обычный импорт:
import csv
Чтение из файлов (парсинг)
Для того чтобы прочитать данные из файла, программист должен создать объект reader:
reader_object = csv.reader(file, delimiter = ",")
reader имеет метод __next__(), то есть является итерируемым объектом, поэтому чтение из файла происходит следующим образом:
import csv
with open("classmates.csv", encoding='utf-8') as r_file:
# Создаем объект reader, указываем символ-разделитель ","
file_reader = csv.reader(r_file, delimiter = ",")
# Счетчик для подсчета количества строк и вывода заголовков столбцов
count = 0
# Считывание данных из CSV файла
for row in file_reader:
if count == 0:
# Вывод строки, содержащей заголовки для столбцов
print(f'Файл содержит столбцы: {", ".join(row)}')
else:
# Вывод строк
print(f' {row[0]} - {row[1]} и он родился в {row[2]} году.')
count += 1
print(f'Всего в файле {count} строк.')
Предположим, что у нас есть CSV файл, который содержит следующую информацию:
Имя,Успеваемость,Год рождения Саша,отличник,200 Маша,хорошистка,1999 Петя,троечник,2000
Тогда, если открыть этот файл в нашей программе, то будут получены следующие результаты:
Файл содержит столбцы: Имя, Успеваемость, Год рождения
Саша - отличник и он родился в 200 году.
Маша - хорошистка и он родился в 1999 году.
Петя - троечник и он родился в 2000 году.
Всего в файле 4 строк.
Использование конструкции with…as позволяет программисту быть уверенным, что файл будет закрыт, даже если при выполнении кода произойдет какая-то ошибка.
Обратите внимание, что при открытии нужно указать правильную кодировку, в которой сохранены данные. В данном случае encoding=’utf-8′. Если не указывать, то будет использоваться кодировка по умолчанию. Для Windows это cp1251.
Библиотека CSV позволяет работать с файлами, как со словарями, для этого нужно создать объект DictReader. Обращаться к элементам можно по имени столбцов, а не с помощью индексов. Для того, чтобы исходная программа делала аналогичный вывод, её следует изменить следующим образом:
import csv
with open("classmates.csv", encoding='utf-8') as r_file:
# Создаем объект DictReader, указываем символ-разделитель ","
file_reader = csv.DictReader(r_file, delimiter = ",")
# Счетчик для подсчета количества строк и вывода заголовков столбцов
count = 0
# Считывание данных из CSV файла
for row in file_reader:
if count == 0:
# Вывод строки, содержащей заголовки для столбцов
print(f'Файл содержит столбцы: {", ".join(row)}')
# Вывод строк
print(f' {row["Имя"]} - {row["Успеваемость"]}', end='')
print(f' и он родился в {row["Год рождения"]} году.')
count += 1
print(f'Всего в файле {count + 1} строк.')
Обращаться к элементам по названию столбца более удобно, кроме того, это упрощает понимание кода.
Обратите внимание, что в цикл for при первой итерации будет записан в row не шапка таблицы, а первая её строка. Поэтому при выводе количества строк переменную count увеличили на 1.
Дополнительные параметры объекта DictReader
DictReader имеет параметры:
dialect— Набор параметров для форматирования информации. Подробнее про них ниже.line_num— Устанавливает количество строк, которое может быть прочитано.fieldnames— Определяет заголовки для столбцов, если не определить атрибут, то в него запишутся элементы из первой прочитанной строки файла. Заголовки нужны для того, чтобы легко было понять, какая информация содержится или должна содержаться в столбце.
Например, если бы в classmates.csv не было бы первой строки с заголовками, то можно было бы его открыть следующим образом:
fieldnames = ['Имя', 'Успеваемость', 'Год рождения'] file_reader = csv.DictReader(r_file, fieldnames = fieldnames)
Также можно использовать метод __next__() для получения следующей строки. Этот метод делает объект reader итерируемым. То есть он вызывается при каждой итерации и возвращает следующую строку. Этот метод и используется при каждой итерации в цикле for для получения очередной строки.
Запись в файлы
Для записи информации в CSV файл необходимо создать объект writer:
file_writer = csv.writer(w_file, delimiter = "t")
Для записи в файл данных используется метод writerow(), который имеет следующий синтаксис:
writecol("Имя", "Фамилия", "Отчество")
Код программы для записи в CSV файл выглядит так:
import csv
with open("classmates.csv", mode="w", encoding='utf-8') as w_file:
file_writer = csv.writer(w_file, delimiter = ",", lineterminator="r")
file_writer.writerow(["Имя", "Класс", "Возраст"])
file_writer.writerow(["Женя", "3", "10"])
file_writer.writerow(["Саша", "5", "12"])
file_writer.writerow(["Маша", "11", "18"])
Обратите внимание, что при записи использовался, lineterminator="r". Это разделитель между строками таблицы, по умолчанию он "rn".
После выполнения программы в файле CSV будет следующий текст:
Имя,Класс,Возраст Женя,3,10 Саша,5,12 Маша,11,18
В качестве параметра метод writerow() принимает список, элементы которого будут записаны в строку через символ-разделитель.
Запись в файл также может быть осуществлена с помощью объекта DictWriter. Важно помнить, что он требует явного указания параметра fieldnames. В качестве аргумента метода writerow используется словарь.
Код программы выглядит так:
import csv
with open("classmates.csv", mode="w", encoding='utf-8') as w_file:
names = ["Имя", "Возраст"]
file_writer = csv.DictWriter(w_file, delimiter = ",",
lineterminator="r", fieldnames=names)
file_writer.writeheader()
file_writer.writerow({"Имя": "Саша", "Возраст": "6"})
file_writer.writerow({"Имя": "Маша", "Возраст": "15"})
file_writer.writerow({"Имя": "Вова", "Возраст": "14"})
Вывод в файл будет следующим:
Имя,Возраст Саша,6 Маша,15 Вова,14
Дополнительные параметры DictWriter
Объект writer также имеет атрибут dialect, который определяет, как будут форматироваться данные при записи в файл, про него будет описано ниже.
Кроме того, writer имеет методы:
- writerows(rows) — Записывает все элементы строк.
- writeheader() — Выводит заголовки для столбцов. Заголовки должны быть переданы объекту writer в виде списка, как атрибут fieldnames.
writeheader был использован в предыдущем примере. Рассмотрим применение writerows:
file_writer.writerows([{"Имя": "Саша", "Возраст": "6"},
{"Имя": "Маша", "Возраст": "15"},
{"Имя": "Вова", "Возраст": "14"}])
Диалекты
Чтобы каждый раз не указывать формат входных и выходных данных, определенные параметры форматирования сгруппированы в диалекты (dialect). При создании объекта reader или writer программист может указать нужный ему диалект, кроме того, некоторые параметры диалекта можно переопределить вручную, также указав их при создании объекта.
Для создания диалекта используется команда:
register_dialect("имя", delimiter = "t", ...)
Класс Dialect позволяет определить следующие атрибуты форматирования:
| Атрибут | Значение |
| delimiter | Устанавливает символ, с помощью которого разделяются элементы в файле. По умолчанию используется запятая. |
| doublequote | Если True, то символ quotechar удваивается, если False, то к символу qutechar добавляется ecsapechar в качестве префикса. |
| escapechar | Строка из одного символа, которая используется для экранирования символа-разделителя. |
| lineterminator | Определяет разделитель для строк, по умолчанию используется «rn» |
| quotechar | Определяет символ, который используется для окружения символа-разделителя. По умолчанию используются двойные кавычки, то есть quotechar = ‘ » ‘. |
| quoting | Определяет символ, который используется для экранирования символа разделителя (если не используются кавычки). |
| skipinitialspace | Если установить значение этого параметра в True, то все пробелы после символа-разделителя будут игнорироваться. |
| strict | Если установить в True, то при неправильном вводе CSV будет возбуждаться исключение Error. |
Пример использования:
import csv
csv.register_dialect('my_dialect', delimiter=':', lineterminator="r")
with open("classmates.csv", mode="w", encoding='utf-8') as w_file:
file_writer = csv.writer(w_file, 'my_dialect')
file_writer.writerow(["Имя", "Класс", "Возраст"])
file_writer.writerow(["Женя", "3", "10"])
file_writer.writerow(["Саша", "5", "12"])
file_writer.writerow(["Маша", "11", "18"])
В результате получим:
Имя:Класс:Возраст Женя:3:10 Саша:5:12 Маша:11:18
Один из самых популярных форматов данных является CSV. Для работы с CSV в Python есть несколько библиотек и модулей. С помощью их вы сможете обрабатывать эти данные конвертируя их в словари и списки, создавать файлы и читать их. Основной модуль называется CSV и большинство задач разберем на его примере.
Как устроен формат CSV
Основное отличие формата CSV от обычного текста в его структуре, которая проявляется в разделителе. Именно из-за этого этот формат расшифровывается как ‘comma separated values’ (значения разделенные запятыми). Разделитель не всегда обязан быть в виде запятой, он может принимать и другие виды, например ‘;’. Разделители так же могут называться делимитер (delimiter). Пример того, как может выглядеть файл:
Имя; Пол; Возраст
Алексей; муж.; 20
Алина; жен.; 21
Первая строка может содержать название заголовки колонок, но это не обязательно. Так же видно, что разделители разделяют значения и из-за этого они не используются в конце строки.
Из-за простого формата CSV вам не обязательно импортировать модули. Вы можете использовать существующий функционал, который создаст данные в формате CSV, например так:
data = [
['Имя', 'Пол', 'Возраст'],
['Алексей', 'муж.', '20'],
['Алина', 'жен.', '21'],
]
csv = ''
for row in data:
csv += ','.join(row) + 'n'
Тем не менее в модулях реализованы дополнительные возможности по анализу таких данных. Например преобразование в словарь или определение форматов (диалекта).
Чтение CSV файлов
Как уже говорилось, основной модуль уже установлен вместе с Python. Для чтения файлов используется функция ‘reader()’, которая возвращает объект для итерации. Так мы можем открыть файл в большинстве случаев:
import csv
with open('file.csv', 'r') as f:
data = csv.reader(f)
for row in data:
print(row)
Для каких-то ОС может понадобится открывать файл с указанием разделителя новой строки, т.е. так:
with open('file.csv', 'r', newline='') as f:
Указание разделителя
По умолчанию считается, что вы используете запятую в качестве делимитра. В моем файле, в качестве разделителя, стоит ‘;’, а файл содержит кириллицу (кириллица имеет значение на Windows). В этом случае файл читается следующим образом:
import csv
with open('file.csv', 'r', encoding='UTF-8') as f:
data = csv.reader(f, delimiter=';')
for row in data:
print(row)
В случае Windows по умолчанию используется кодировка ‘cp1251’ и, если вы не укажете ‘UTF-8’, то может появится ошибка:
- UnicodeDecodeError: ‘charmap’ codec can’t decode byte 0x98 in position 1: character maps to <undefined>
Начальные пробелы
Со скриншота выше видно, что пробелы, в начале строки, не обрабатываются должным образом. Что бы убрать пробелы нужно указать параметр ‘skipinitialspace’:
import csv
with open('file.csv', 'r', encoding='UTF-8') as f:
data = csv.reader(f, delimiter=';', skipinitialspace=True)
for row in data:
print(row)
Кавычки
CSV файл может содержать кавычки в произвольных местах:
"Name","Age","Sex"
"Alexander Melnikov",45,"m"
"Piter Tolstoy",23,"m"
Убрать их можно используя параметр ‘quoting’:
import csv
with open('file.csv', 'r') as f:
data = csv.reader(f, quoting=csv.QUOTE_ALL)
for row in data:
print(row)
По умолчанию ищется двойная кавычка. Если вы хотите ее переопределить, то нужно использовать параметр ‘quotechar’.
Поиска этой кавычки зависит от того, что указано в параметр ‘quoting’. Так значение ‘csv.QUOTE_ALL‘ говорит, что все значения находятся внутри кавычек. Параметр может принимать другие значения:
- csv.QUOTE_MINIMAL — используется по умолчанию. Кавычки используются в местах содержащие специальные символы (например двойная кавычка из quotechar или сам дилиметр);
- csv.QUOTE_NONNUMERIC — кавычки используются в нечисловых значениях. Если кавычек в значении не присутствует оно будет преобразовано во float;
- csv.QUOTE_NONE — кавычки, вокруг значений, не используются.
Если вы установили ‘csv.QUOTE_NONE’, а в файле все равно экранируются специальные символы, то можно использовать параметр ‘escapechar’ указывающий на символ экранирования.
Чтение с конвертацией в словарь
Если первая строка у вас содержит заголовки колонок, то вы ее можно преобразовать в ключи словаря. Что бы это сделать, вместо метода ‘reader()’ используется класс ‘DictReader()’:
import csv
with open('file.csv', 'r') as f:
data = csv.DictReader(f, delimiter=';')
for row in data:
print(row)
Тип словаря зависит от версии Python. Если вы используете версию ниже 3.8, то вернется ‘OrderedDict’, который можно преобразовать в обычный с ‘dict()’. В версиях 3.8 и старше возвращается обычный тип словаря.
Параметры у класса аналогичны методу ‘reader()’. Мы так же можем определять кавычки и символы экранирования.
Создание шаблона диалекта
Если у вас используется множество разных параметров и идет нарушение принципов DRY (dont repeat yorself), то вы можете использовать диалект (или просто шаблон). В примере мы регистрируем параметры под общим названием ‘myDialect’ и передаем в функцию или класс:
import csv
csv.register_dialect('myDialect',
delimiter=';',
skipinitialspace=True,
quoting=csv.QUOTE_ALL)
with open('file1.csv', 'r') as f:
data = csv.reader(f, dialect='myDialect')
for row in data:
print(row)
with open('file2.csv', 'r') as f:
data = csv.reader(f, dialect='myDialect')
for row in data:
print(row)
Автоматическое определение параметров CSV файла
Если используются разные файлы CSV и в каждом из них разные параметры для чтения, мы можем определить их автоматически с классом ‘Sniffer’. Результат работы этого класса мы можем передать как диалект:
import csv
with open('file.csv', 'r') as f:
# читаем первые 100 символов (или весь файл)
sample = f.read(100)
# пример проверки, что файл имеет заголовки
header = csv.Sniffer().has_header(sample)
print('В файле есть заголовки: ', header)
# создаем диалект
dialect = csv.Sniffer().sniff(sample)
with open('file.csv', 'r') as f:
# передаем диалект и читаем файл
reader = csv.reader(f, dialect)
for row in reader:
print(row)
Метод ‘has_header()’ проверяет есть ли в файле заголовки. Аналогично этому методу могут быть использованы и другие методы проверяющие кавычки, делимитры и т.д.
Чтение в pandas
В библиотеке для анализа данных pandas так же есть возможность прочитать CSV файл. Эта библиотека устанавливается отдельно:
import pandas
csv = pandas.read_csv('file.csv', delimiter=';')
print(csv)
Запись данных в CSV
Для записи данных есть функция ‘writer()’. В эту функцию мы можем передать все те же параметры, что в случае чтения. Базовая запись данных будет выглядеть следующим образом:
import csv
lines = [
['Alexander Melnikov', '31', 'm'],
['Mihail Tolstoy', '28', 'm'],
]
with open('file_w.csv', 'w', newline='') as f:
writer = csv.writer(f)
for line in lines:
writer.writerow(line)
# или просто
# writer.writerows(lines)
Как и понятно с примера выше:
- writerow — записывает каждый список построчно;
- writerows — записывает список списков в файл целиком.
Надобность в ‘newline’ так же может отличаться в разных ОС. Вы можете указать в функции ‘writer’ параметр ‘lineterminator’ со значением ‘n’, который обозначает символ переноса новой строки. По умолчанию он равен ‘rn’:
...
with open('file_w.csv', 'w') as f:
writer = csv.writer(f, lineterminator='n')
...
Аналогично ‘lineterminator’ могут передаваться следующие параметры:
- quotechar — символ для экранирования значений попадающие под условия указанные в ‘quoting’. По умолчанию этот символ равен двойным кавычкам;
- quoting — какие значения должны быть экранированы: csv.QUOTE_MINIMAL (если в значении есть делимитер или сам символ экранирования), csv.QUOTE_ALL (все символы), csv.QUOTE_NONNUMERIC (оборачивает в кавычки все нечисловые значения), csv.QUOTE_NONE (не использует кавычки и, если в значениях используется символ делимитера, экранирует его в ‘escapechar’);
- escapechar — если поведение с кавычками не установлено, то символы разделителя в значениях экранируются в этот символ.
Пример использования:
import csv
lines = [
['Alexander, Melnikov', '31', 'm'],
['Mihail Tolstoy', '28', 'm'],
]
with open('file_w.csv', 'w', newline='') as f:
writer = csv.writer(f, escapechar='*', quoting=csv.QUOTE_NONE)
writer.writerows(lines)
Запись словаря
Аналогично чтению мы можем выполнить конвертацию словаря в CSV. Для этого есть класс ‘DictWriter’. Запись словаря, от его чтения, отличается параметром ‘fieldnames’ в котором указываются заголовки колонок. Пример такой записи:
import csv
lines = [
{'name': 'Alexander Melnikov', 'age': 38, 'sex': 'm'},
{'name': 'Mihail Tolstoy', 'age': 28, 'sex': 'm'},
]
with open('file_w.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['age','sex','name'])
for line in lines:
writer.writerow(line)
# или просто
# writer.writerows(lines)
Параметры, переданные в ‘DictWriter’, могут быть такими же что и в ‘writer’.
Запись с pandas
Что бы сохранить данные с pandas мы сначала должны выполнить конвертацию в ‘DataFrame’:
import pandas as pd
# словарь
lines1 = [
{'name': 'Alexander Melnikov', 'age': 38, 'sex': 'm'},
{'name': 'Mihail Tolstoy', 'age': 28, 'sex': 'm'},
]
# список
lines2 = [
['Alexander Melnikov', 38, 'm'],
['Mihail Tolstoy', 28, 'm'],
]
lines1 = pd.DataFrame(lines1)
lines2 = pd.DataFrame(lines2)
lines1.to_csv('example1.csv')
lines2.to_csv('example2.csv')
…
Теги:
#python
#csv
Уведомления
- Начало
- » Python для новичков
- » Как вывести в кириллице строки из файла .CSV
#1 Март 11, 2014 15:19:56
Как вывести в кириллице строки из файла .CSV
Здравствуйте!
Есть файл в формате CSV.
В консоли windows запускаю скрипт для чтения и вывода строк:
# -*- coding: utf8 -*- text = open('books.csv').readline() print text
В итоге на экран выводятся кракозябры (см.скриншот).
Подскажите, пожалуйста, как сделать нормальный вывод кириллицей?
Прикреплённый файлы: 
Офлайн
- Пожаловаться
#2 Март 11, 2014 15:37:14
Как вывести в кириллице строки из файла .CSV
как вариант сконвертировать строку с кодировки файла в юнико, а затем в кодировку терминала. Для этого надо еще Ваш файл.
Отредактировано Singularity (Март 11, 2014 15:38:38)
Офлайн
- Пожаловаться
#3 Март 11, 2014 15:38:54
Как вывести в кириллице строки из файла .CSV
bmco@mail.ru
Подскажите, пожалуйста, как сделать нормальный вывод кириллицей?
Либо изменить кодировку консоли на кодировку выводимого текста, либо кодировку текста на кодировку консоли.
Офлайн
- Пожаловаться
#4 Март 11, 2014 15:40:08
Как вывести в кириллице строки из файла .CSV
Budulianin
а если надо выводить внезапно с двух файлов с разными кодровками ?
Офлайн
- Пожаловаться
#5 Март 11, 2014 15:41:53
Как вывести в кириллице строки из файла .CSV
Singularity
а если надо выводить внезапно с двух файлов с разными кодровками ?
Приводить текст к одной кодировке
Офлайн
- Пожаловаться
#6 Март 11, 2014 15:44:27
Как вывести в кириллице строки из файла .CSV
Budulianin
чет мне кажеться что это не всегда возможно.
Офлайн
- Пожаловаться
#7 Март 11, 2014 15:47:35
Как вывести в кириллице строки из файла .CSV
Singularity
чет мне кажеться что это не всегда возможно.
Тебе кажется. В программе, работа идёт с юникодом, так что без разницы, в какой кодировке потом писать
Офлайн
- Пожаловаться
#8 Март 11, 2014 15:48:19
Как вывести в кириллице строки из файла .CSV
Singularity
как вариант сконвертировать строку с кодировки файла в юнико, а затем в кодировку терминала. Для этого надо еще Ваш файл.
Вот сам файл CSV
Прикреплённый файлы: 
Офлайн
- Пожаловаться
#9 Март 11, 2014 15:59:34
Как вывести в кириллице строки из файла .CSV
print text.decode('cp1251').encode('cp866')
Вроде так
Офлайн
- Пожаловаться
#10 Март 11, 2014 16:17:51
Как вывести в кириллице строки из файла .CSV
Singularity
Singularity, большое спасибо за помощь! Ваш принт успешно работает!
Или можно таким образом:
# -*- coding: utf-8 -*- import sys import locale text = open('books.csv').readline() # print text.decode('cp1251').encode('cp866') print text.decode(locale.getpreferredencoding()).encode(sys.stdout.encoding)
Офлайн
- Пожаловаться
- Начало
- » Python для новичков
- » Как вывести в кириллице строки из файла .CSV











