Pandas read csv encoding windows 1251

\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'
>>>

  • Panda free antivirus windows xp
  • Panasonic kx mb773 драйвер windows 10
  • Page fault in nonpaged area windows 10 при установке компаса
  • Panasonic tem824 usb driver windows 10
  • Panasonic kx mb763 драйвер windows 10