\ea
is the windows-1251 / cp5347 encoding for к
. Therefore, you need to use windows-1251
decoding, not UTF-8.
In Python 2.7, the CSV library does not support Unicode properly — See «Unicode» in https://docs.python.org/2/library/csv.html
They propose a simple work around using:
class UnicodeReader:
"""
A CSV reader which will iterate over lines in the CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
f = UTF8Recoder(f, encoding)
self.reader = csv.reader(f, dialect=dialect, **kwds)
def next(self):
row = self.reader.next()
return [unicode(s, "utf-8") for s in row]
def __iter__(self):
return self
This would allow you to do:
def loadCsv(filename):
lines = UnicodeReader(open(filename, "rb"), delimiter=";", encoding="windows-1251" )
# if you really need lists then uncomment the next line
# this will let you do call exact lines by doing `line_12 = lines[12]`
# return list(lines)
# this will return an "iterator", so that the file is read on each call
# use this if you'll do a `for x in x`
return lines
If you try to print dataset
, then you’ll get a representation of a list within a list, where the first list is rows, and the second list is colums. Any encoded bytes or literals will be represented with \x
or \u
. To print the values, do:
for csv_line in loadCsv("myfile.csv"):
print u", ".join(csv_line)
If you need to write your results to another file (fairly typical), you could do:
with io.open("my_output.txt", "w", encoding="utf-8") as my_ouput:
for csv_line in loadCsv("myfile.csv"):
my_output.write(u", ".join(csv_line))
This will automatically convert/encode your output to UTF-8.
Code Sample, a copy-pastable example if possible
import pandas cyrillic_filename = "./файл_1.csv" # 'c' engine fails: df = pandas.read_csv(cyrillic_filename, engine="c", encoding="cp1251") --------------------------------------------------------------------------- OSError Traceback (most recent call last) <ipython-input-18-9cb08141730c> in <module>() 2 3 cyrillic_filename = "./файл_1.csv" ----> 4 df = pandas.read_csv(cyrillic_filename , engine="c", encoding="cp1251") d:\0_dev\services\protocol_sort\venv\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision) 653 skip_blank_lines=skip_blank_lines) 654 --> 655 return _read(filepath_or_buffer, kwds) 656 657 parser_f.__name__ = name d:\0_dev\services\protocol_sort\venv\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds) 403 404 # Create the parser. --> 405 parser = TextFileReader(filepath_or_buffer, **kwds) 406 407 if chunksize or iterator: d:\0_dev\services\protocol_sort\venv\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds) 762 self.options['has_index_names'] = kwds['has_index_names'] 763 --> 764 self._make_engine(self.engine) 765 766 def close(self): d:\0_dev\services\protocol_sort\venv\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine) 983 def _make_engine(self, engine='c'): 984 if engine == 'c': --> 985 self._engine = CParserWrapper(self.f, **self.options) 986 else: 987 if engine == 'python': d:\0_dev\services\protocol_sort\venv\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds) 1603 kwds['allow_leading_cols'] = self.index_col is not False 1604 -> 1605 self._reader = parsers.TextReader(src, **kwds) 1606 1607 # XXX pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.__cinit__ (pandas\_libs\parsers.c:4209)() pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._setup_parser_source (pandas\_libs\parsers.c:8895)() OSError: Initializing from file failed # 'python' engine work: df = pandas.read_csv(cyrillic_filename, engine="python", encoding="cp1251") df.size >>172440 # 'c' engine works if filename can be encoded to utf-8 latin_filename = "./file_1.csv" df = pandas.read_csv(latin_filename, engine="c", encoding="cp1251") df.size >>172440
Problem description
The ‘c’ engine should read the files with non-UTF-8 filenames
Expected Output
File content readed into dataframe
Output of pd.show_versions()
INSTALLED VERSIONS
commit: None
python: 3.6.1.final.0
python-bits: 32
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None
LOCALE: None.None
pandas: 0.20.3
pytest: None
pip: 9.0.1
setuptools: 28.8.0
Cython: None
numpy: 1.13.2
scipy: 0.19.1
xarray: None
IPython: 6.2.1
sphinx: None
patsy: None
dateutil: 2.6.1
pytz: 2017.2
blosc: None
bottleneck: None
tables: None
numexpr: None
feather: None
matplotlib: None
openpyxl: 2.4.8
xlrd: None
xlwt: None
xlsxwriter: None
lxml: 4.0.0
bs4: None
html5lib: 1.0b10
sqlalchemy: None
pymysql: None
psycopg2: None
jinja2: 2.9.6
s3fs: None
pandas_gbq: None
pandas_datareader: None
None
Доброго времени всем!
Читаю с CSV файла кириллицу, вывожу в файлы и получаю xd0x94xd0xbexd0xb1xd0xb0xd0xb2xd0xb8xd1x82xd1x8, как читать и выводить кириллицу?
Задача:
входной файл csv — взять его шапку и сделать ключи.
Каждая новая строка — значения.
На выходе список со словарями.
Далее список надо вывести в файл, и в тех местах, где использована кириллица в CSV — получается xd0x94xd0xbexd0xb1xd0xb0xd0xb2xd0xb8xd1x82xd1x8.
Код(без кириллицы все работает как надо):
# -*- coding: utf-8 -*-
import csv, codecs
import re
def readCSV(filename):
csvfile = open(filename, 'r') #open file for read
spamreader = csv.reader(csvfile)
dictFromCSV = dict()
i = 0
j = 0
listFroDictWithValueFromCSV = list()
for row in spamreader:
if ';;;' in row[0]: #?????? ?? ?????? ????? - ??? ????????? ??????. ?????? ?????? ???????? ?????? ???????????. ?? 10 ?? 14 ????.
pass
elif i == 0: #?????????? ????? ??????? - ??? ????? ????? ?????? ??????? ??????????? ??????? ?????? ??? ??????
keysForDict = str(row).split(';')
keysForDict = str(keysForDict)
keysForDict = re.sub(r'[^\w\s]+|[\d]+', r'', keysForDict).strip()
keysForDict = str(keysForDict).split(" ")
lenght = len(keysForDict)
i = i + 1
#print keysForDict
else: #????? ???????? ??????? ???????????? ???????? ? ?????????? ??????? ?????(????) ???????? ? ??????? ?? ???? ?????.
row = str(row).split(";")
row = str(row)
row = re.sub(r'[^\w\s]+', r'', row).strip()
#print row
#print ("######################")
row = str(row).split(" ")
#print row
for i in range(0,lenght): #counts row in csv-file
dictFromCSV[keysForDict[j]] = str(row[i])
j = j + 1
i = i + 1
listFroDictWithValueFromCSV.append(dictFromCSV.copy()) #?????????? ??? ??????? ? ???? ??????
j = 0
#print keysForDict
return listFroDictWithValueFromCSV;
Так же буду рад любой критике\советам, как сделать код производительней\читабельней.
P.S. список выводится в файл в другой функции.
P.S.S. Англоязычная винда прокачала комменты, которые были по русски написаны.
Для работы с данными на языке Python часто используется библиотека Pandas. Однако, иногда возникают проблемы с отображением русских букв в Pandas, IPython и Jupyter Notebook. В этой статье мы рассмотрим причины появления данной проблемы и способы ее устранения.
Причины неработоспособности русских букв в Pandas, IPython и Jupyter Notebook
Проблема заключается в том, что при работе с текстовыми данными на русском языке в Pandas, IPython и Jupyter Notebook возникает ошибка, связанная с кодировкой. На самом деле, данная проблема не связана непосредственно с Pandas, IPython и Jupyter Notebook, а зависит от питоновской среды, в которой они работают.
Одной из наиболее распространенных причин ошибки является неправильно указанная кодировка. Если в вашем документе или базе данных используется кодировка отличная от utf-8, то при отображении русских букв возникают проблемы. Например, если вы используете windows-1251, то многие браузеры по умолчанию отображают русский текст некорректно.
Мы можем убедиться в этом, создав файл с текстовыми данными на русском языке, сохраненными не в utf-8 кодировке. Для этого создадим файл «test.csv» с текстовым содержимым на русском языке:
Имя,Возраст Алексей,30 Сергей,35
Затем попробуем загрузить данный файл в Pandas с помощью функции read_csv:
import pandas as pd df = pd.read_csv('test.csv') print(df)
И получим следующую ошибку:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte
Эта ошибка возникает из-за того, что Pandas по умолчанию ожидает файлы с данными в utf-8 кодировке. Однако, наш файл сохранен в windows-1251 кодировке.
Как решить проблему с кодировкой
Для решения проблемы необходимо изменить кодировку на utf-8. Сделать это можно несколькими способами:
1. Пересохранить файл в utf-8 кодировке. Для этого откройте файл в текстовом редакторе (например, Notepad++) и выберите в меню «Файл» — «Сохранить как». В строке «кодировка» выберите utf-8 и сохраните файл. После этого функция read_csv будет работать корректно.
2. При использовании функции read_csv можно указать параметр encoding с нужной кодировкой. Например, для чтения файла в windows-1251 кодировке нужно использовать следующий код:
import pandas as pd df = pd.read_csv('test.csv', encoding='windows-1251') print(df)
3. Использование конвертеров для преобразования кодировок. Например, можно воспользоваться библиотекой chardet для автоматического определения кодировки файла и ее последующего преобразования в utf-8.
import pandas as pd import chardet with open('test.csv', 'rb') as f: result = chardet.detect(f.read()) # определение кодировки файла df = pd.read_csv('test.csv', encoding=result['encoding']) print(df)
Как настроить отображение русских букв в IPython и Jupyter Notebook
Если у вас уже установлены Pandas, IPython и Jupyter Notebook, но при выводе русского текста вы видите непечатаемые символы или иероглифы, то скорее всего проблема в том, что ваша система не поддерживает отображение русских символов.
Для решения данной проблемы необходимо настроить языковые параметры вашей системы. Откройте консоль и выполните следующую команду:
set PYTHONIOENCODING=utf-8
Эта команда установит кодировку utf-8 для вывода данных в IPython и Jupyter Notebook.
Также можно использовать следующий код для установки кодировки utf-8 в начале каждого ноутбука:
import sys sys.setdefaultencoding('utf-8')
Как правильно работать с русскими текстовыми данными в Pandas, IPython и Jupyter Notebook
После решения проблем с кодировкой и настройкой языковых параметров вы можете работать с текстовыми данными на русском языке в Pandas, IPython и Jupyter Notebook без каких-либо ограничений.
Однако, следует учитывать, что при работе с русскими данными возникают некоторые особенности. Например, при фильтрации данных с русскими буквами может происходить неожиданный результат, связанный с учетом регистра. Для решения данной проблемы следует использовать функцию lower для приведения строк к нижнему регистру:
import pandas as pd df = pd.read_csv('test.csv', encoding='utf-8') filtered_df = df[df['Имя'].str.lower() == 'алексей'] print(filtered_df)
Вывод
В этой статье мы рассмотрели основные причины проблем с отображением русских букв в Pandas, IPython и Jupyter Notebook и способы их решения. Также мы выяснили некоторые особенности работы с русскими текстовыми данными в Pandas, IPython и Jupyter Notebook. Учитывая эти особенности и используя методы, описанные в этой статье, вы сможете уверенно работать с русскими текстовыми данными в своих проектах.
1 2 3 4 5 |
>>> f = open(r"output.csv", encoding="utf-8") >>> t = f.read() >>> t.encode("windows-1252").decode("windows-1251") ',0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\n0,E08347624,МГТС,АСРЗ,ФЛ,Выезд Обзвон,Замена абонентского устройства ONT/STB/модема(аварийная),Полное отсутствие сервиса,2020-12-02 09:04:38,2020-12-02 09:04:38,2020-12-04 11:00:45,2020-12-03 11:50:07,0508079527,ТВ. Надпись на экране: сервер не найден,70508079527,Телевидение\n1,E08347625,МГТС,АСРЗ,ФЛ,Выезд Обзвон,Перезагрузка/настройка абонентского устройства,Полное отсутствие сервиса,2020-12-02 09:04:44,2020-12-02 09:04:44,2020-12-03 09:04:44,2020-12-02 18:50:05,4994928408,Телефония. Тишина в трубке,74994928408,Телефония\n' >>> |