Задать вопрос
@Pompeius_Magnus
Студент

Читаю с CSV файла кириллицу, вывожу в файлы и получаю xd0x94xd0xbexd0xb1xd0xb0xd0xb2xd0xb8xd1x82xd1x8, как читать и выводить кириллицу?

Доброго времени всем!

Читаю с 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. Англоязычная винда прокачала комменты, которые были по русски написаны.
  • Вопрос задан
  • 21082 просмотра
Подписаться 3 Оценить Комментировать
Решения вопроса 2
@lPolar
data scientist
А можно сделать совсем элегантно (Py3):
import pandas as pd
fname = r'C:\folder\myfile.csv'
data = pd.read_csv(fname,sep='\t',encoding='cp1251')
print(data)
Ответ написан
suguby
@suguby
программист, python, django, mysql, git, hg, linux
При чтении из файла надо делать decode() из кодировки файла - тогда все будет в unicode. При выводе - так же конвертировать, с encode(). Наиболее распространенная кодировка - UTF8, у вас какая в файле?

вот это
for i in range(0,lenght): #counts row in csv-file
                dictFromCSV[keysForDict[j]] = str(row[i])
                j = j + 1
            i = i + 1

можно сделать элегантнее
dictFromCSV = dict(zip(keysForDict, row))
еще про стиль - переменные и имена функция надо называть в_стиле_подчерков, КамелКейзом идут названия классав - пруф rukeba.com/by-the-way/pep8-korotko-i-po-russki
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Romarioagors
читаю из CSV Pandas, получаю - Мега
df = pd.read_csv(path, delimiter=";",low_memory=False , encoding = 'CP866' )
перебрал уже все кодировки :
# cp1251
# 'IBM866'
# windows - 1251
# utf-8'
# encoding='ANSI'
# 'ISO-8859-1'
# cp866 ,DOS-720
# CP866
# CP437
# KOI8-U
# KOI8-R
# KOI-7
Ничего не помогает, что посоветуете?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы