\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.
Solution 1
\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.
Solution 2
You cant try:
import pandas as pd
pd.read_csv(path_file , "cp1251")
or
import csv
with open(path_file, encoding="cp1251", errors='ignore') as source_file:
reader = csv.reader(source_file, delimiter=",")
Solution 3
Can your .csv be another encoding, not UTF-8? (considering error message, it even should be). Try other cyrillic encodings such as Windows-1251 or CP866 or KOI8.
Comments
-
I have some data in CSV file that are in Russian:
2-комнатная квартира РДТ', мкр Тастак-3, Аносова — Толе би;Алматы 2-комнатная квартира БГР', мкр Таугуль, Дулати (Навои) — Токтабаева;Алматы 2-комнатная квартира ЦФМ', мкр Тастак-2, Тлендиева — Райымбека;Алматы
Delimiter is
;
symbol.
I want to read data and put it into array. I tried to read this data using this code:
def loadCsv(filename): lines = csv.reader(open(filename, "rb"),delimiter=";" ) dataset = list(lines) for i in range(len(dataset)): dataset[i] = [str(x) for x in dataset[i]] return dataset
Then I read and print result:
mydata = loadCsv('krish(csv3).csv') print mydata
Output:
[['2-\xea\xee\xec\xed\xe0\xf2\xed\xe0\xff \xea\xe2\xe0\xf0\xf2\xe8\xf0\xe0, \xec\xea\xf0 \xd2\xe0\xf1\xf2\xe0\xea-3, \xc0\xed\xee\xf1\xee\xe2\xe0 \x97 \xd2\xee\xeb\xe5 \xe1\xe8', '\xc0\xeb\xec\xe0\xf2\xfb'], ['2-\xea\xee\xec\xed\xe0\xf2\xed\xe0\xff \xea\xe2\xe0\xf0\xf2\xe8\xf0\xe0, \xec\xea\xf0 \xd2\xe0\xf3\xe3\xf3\xeb\xfc, \xc4\xf3\xeb\xe0\xf2\xe8 (\xcd\xe0\xe2\xee\xe8) \x97 \xd2\xee\xea\xf2\xe0\xe1\xe0\xe5\xe2\xe0', '\xc0\xeb\xec\xe0\xf2\xfb'], ['2-\xea\xee\xec\xed\xe0\xf2\xed\xe0\xff \xea\xe2\xe0\xf0\xf2\xe8\xf0\xe0, \xec\xea\xf0 \xd2\xe0\xf1\xf2\xe0\xea-2, \xd2\xeb\xe5\xed\xe4\xe8\xe5\xe2\xe0 \x97 \xd0\xe0\xe9\xfb\xec\xe1\xe5\xea\xe0', '\xc0\xeb\xec\xe0\xf2\xfb']]
I found that in this case codecs are required and tried to do the same with this code:
import codecs with codecs.open('krish(csv3).csv','r',encoding='utf8') as f: text = f.read() print text
I got this error:
newchars, decodedbytes = self.decode(data, self.errors) UnicodeDecodeError: 'utf8' codec can't decode byte 0xea in position 2: invalid continuation byte
What is the problem? When using codecs how to specify delimiter in my data?
I just want to read data from file and put it in 2-dimensional array.-
return ([f.decode('cp1251') if isinstance(s, bytes) else f for f in row] for row in csv.reader(open(filename, "rb"),delimiter=";"))
-
-
Sorry, see latest edit. Your code should use
UnicodeReader()
-
I have included UnicodeReader and UTF8Recoder in my code and tried to use loadCsv(). But data in dataset variable looks like this: u»2-\u043a\u043e\u043c\u043d\u0430\u0442. Is there something that I do wrong?
-
No, that’s fine. It’s because you’re printing the whole line, which is a
list
, so you get a «representation». What you’re seeing is Unicode literals, which means your data has been correctly decoded. This is a good thing! Try doingprint line[0]
, which will encode the Unicode values to your console’s locale -
I’ve added some code to show how to iterate and join your results
-
Ah, yes. I see why that would happen. I’ve updated the
loadCsv
method to return something. -
spent 3+ hours, This was helpful, however, I just read directly from csv like thhis, using the WINDOWS encoding as was suggested pd.read_csv(‘data.csv’, sep=’;’ , encoding=’windows-1251′)
Recents
Вам предлагаются для обработки различные данные в формате CSV. Данные представляют собой текстовый файл, каждая строка
которых содержит некоторое количество данных, разделённых одинаковым символом. Аббревиатура CSV обозначает
Comma-Separated Values, однако в качестве разделителя будет
использоваться другой символ.
Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками («).
Если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд.
В русской и других локалях запятая по умолчанию зарезервирована под десятичный разделитель.
Поэтому как разделитель используется точка с запятой или табуляция.
Несмотря на наличие RFC (стандарта), на сегодняшний день под CSV, как правило, понимают набор значений, разделенных какими угодно разделителями, в какой угодно
кодировке с какими угодно окончаниями строк и множеством различных способов экранирования спецсимволов.
Это значительно затрудняет перенос данных из одних программ в другие, несмотря на всю простоту реализации поддержки CSV.
Довольно часто в первой строке csv-файла приведены названия столбцов.
При этом они оформлены как строка текстовых констант.
Модуль csv в питоне
csv-файлы — это обычные текстовые файлы, поэтому обрабатывать их можно почти как угодно.
Однако из-за разнообразия разделителей и необходимости экранирования специальных симоволов гораздо удобнее пользоваться специальными модулями.
В питоне для обработки csv-файлов есть модуль csv.
Разберёмся с его работой на примере файла с экспортом сданных решений в ejudge.
Прочитать его можно так:
import csv with open(r'ejudge1.csv', newline='', encoding='utf-8') as csvfile: for row in csv.reader(csvfile, delimiter=';'): print(row) # ['Run_Id', 'Time', 'Nsec', 'Time2', 'Date', 'Year', 'Mon', 'Day', 'Hour', 'Min', 'Sec', 'Dur', 'Dur_... # ['0', '1550318948', '048328000', '20190216150908', '20190216', '2019', '02', '16', '15', '09', '08',... # ['1', '1550318957', '854219000', '20190216150917', '20190216', '2019', '02', '16', '15', '09', '17',... # ['2', '1550318967', '504577000', '20190216150927', '20190216', '2019', '02', '16', '15', '09', '27',...
или так:
import csv with open(r'ejudge1.csv', newline='', encoding='utf-8') as csvfile: data = list(csv.reader(csvfile, delimiter=';'))
Если первая строка файла содержит названия столбцов, то эту строку можно прочитать отдельно, создав итератор из csv.reader
:
with open(r'ejudge1.csv', newline='', encoding='utf-8') as csvfile: csv_reader = iter(csv.reader(csvfile, delimiter=';')) field_names = next(csv_reader) for row in csv_reader: ...
csv.DictReader
Если первая строка файла содержит названия столбцов, то вместо обычного csv.reader
удобно использовать csv.DictReader
.
Он работает почти так же, только не возвращает строку с именами столбцов.
А также для каждой строчки вместо списка значений возвращает словарь (ну, почти словарь).
Это позволяет обращаться к данным в строчке по имени столбца, что очень удобно и наглядно:
with open(r'ejudge1.csv', newline='', encoding='utf-8') as csvfile: for row in csv.DictReader(csvfile, delimiter=';'): print(row['User_Login'], row['User_Id']) # s21v_kiryakov 21310 # s22v_bolgov 22307 # s23b_orekhov 23217
А вот так можно сохранить в переменную тольно нужные столбцы из файла:
columns_to_read = ['User_Id', 'User_Login', 'Score'] with open(r'ejudge1.csv', newline='', encoding='utf-8') as csvfile: data = [{key: row[key] for key in columns_to_read} for row in csv.DictReader(csvfile, delimiter=';')] pprint(data) # [{'Score': '100', 'User_Id': '21310', 'User_Login': 's21v_kiryakov'}, # {'Score': '80', 'User_Id': '22307', 'User_Login': 's22v_bolgov'}, # ...
Особенности ввода-вывода
В каждой задаче вы можете читать данные либо из файла data.csv
, либо со стандартного ввода.
Программа должна вывести результат либо в файл output.txt
, либо на стандартный вывод.
CSV-данные на сайте data.mos.ru записаны в кодировке Windows-1251, но в тестирующей системе
этот же файл будет сконвертирован в кодировку UTF-8.
Вы можете скачать файл с данными и сконвертировать его на своём компьютере из кодировки Windows-1251 в кодировку UTF-8,
либо осуществлять перекодировку средствами языка Python при открытии файла, в этом случае в функцию open
нужно передать параметр encoding="cp1251"
. При сдаче задачи в тестирующую систему этот параметр нужно убрать или заменить на
encoding="utf-8"
.
Кроме того, если вы используете в программе текстовые строки, записанные на русском языке, то сам файл с программой
должен быть сохранён в кодировке UTF-8 (по умолчанию Wing IDE может сохранять файлы в кодировке CP-1251).
Для этого в первой строке файла программы на языке Python следует установить кодировку самого файла с программой:
# -*- coding: utf-8 -*-
A: Ejudge: статистика по языкам программирования
Изучите файл с экспортом сданных решений в ejudge, контест проводится в формате личной олимпиады.
Интересные для вас поля в этом файле:
User_Id — уникальный числовой идентификатор пользователя.
User_Login — уникальный логин пользователя (также можно использовать, как уникальный числовой идентификатор).
User_Inv — у скрытого пользователя в этом поле записан символ «I».
Lang — идентификатор языка программирования.
Score — Количество баллов, полученных за задачу.
Посчитайте общее число участников контеста, а также то, сколько участников использовало тот или иной язык программирования.
Будем считать, что участник использует язык программирования, если он сдал хотя бы одно решение, набравшее больше 0 баллов.
Скрытых пользователей учитывать не нужно.
Выведите общее число пользователей (Total) в первой строке, считаются только участники, сдавшие хотя бы одну задачу на ненулевой балл.
В последующий строках выведите все использованные языки программирования,
после слова Total или названия языка программирования через двоеточие и пробел выведите число участников. Список упорядочите по убыванию
числа участников, использующих данный язык программирования, при равных значениях — в лексикографическом порядка названия языка программирования.
Пример результата работы программы для данного файла:
Total: 19
python3: 19
g++: 5
B: Ejudge: результаты личной олимпиады
Вам понадобятся также следующие поля:
User_Name — имя пользователя в таблице результатов
Prob — идентификатор задачи (произвольная строка).
По каждой задаче пользователь получает балл, равный максимальному числу баллов из всех сабмитов по этой задаче.
Сумма баллов, набранных участником, равна сумме баллов за все задачи.
Для каждого участника посчитайте сумму баллов, которые он набрал по всем задачам. Упорядочите участников по убыванию суммы баллов,
при равной сумме баллов — в лексикографическом порядке поля User_Name. Выведите упорядоченный список: сначала имя пользователя,
потом через двоеточие и пробел — его баллы.
Решения, имеющие статус Compilation error имеют значение поля Score равное -1, эти решения учитывать не нужно (их балл равен 0).
Eсли все решения участника набрали 0 баллов, то участник тоже участвовал в олимпиаде и его результат тоже нужно выводить.
Имена участников могут совпадать (привет Александрам Некрасовым), идентифицировать участников нужно по логину или id,
но выводить нужно имена.
Пример результата работы программы для данного файла:
[9В] Порфирьев Антон: 400
[7Б] Сергиенко Дмитрий: 366
[9В] Павлек Николай: 363
[9Д] Миронов Сергей: 362
[9В] Смирнягин Артем: 359
[7Б] Бурков Илья: 358
[9В] Овчинников Андрей: 356
[9В] Фирсов Федор: 351
[9В] Севастьянова Александра: 331
[7Б] Орехов Савва: 330
[9В] Калабай Михаил: 330
[9В] Кирьяков Сергей: 330
[9В] Осипов Григорий: 330
[9В] Бархварт Максим: 321
[8В] Болгов Михаил: 320
[9В] Ингман Глеб: 320
[9В] Сутый Дмитрий: 320
[9В] Рылин Илья: 318
[8В] Черных Владимир: 308
C: Ejudge: результаты командной олимпиады
Изучите файл с экспортом сданных решений в ejudge, контест проводится в формате командной олимпиады.
Интересные для вас поля в этом файле:
Stat_Short — равен OK, если решение прошло все тесты.
Dur — время сдачи в секундах решения от начала тура. Также вместо поля Dur можно использовать поля Dur_Hour и Dur_Min, равных
количеству прошедших с начала тура часов и минут.
По правилам командной олимпиады команды ранжируются по убьванию числа решённых задач. При равном числе решённых задач команды
ранжируются по возрастанию штрафного времени. Штрафное время по задаче равно времени, в которой было сдано решение этой задачи на OK,
измеряемое в минутах от начала тура, плюс 20 штрафных минут за каждую неудачную попытку сдать решение этой задачи. Например, если команда
сделала 2 неудачные попытки по задаче, и после этого сдала решение на OK через 1 час 5 минут 30 секунд после начала тура, то
команда получает \(65 + 2\times 20=105\) штрафных минут. Значение поля Dur у удачной попытки будет равно \(1\times 3600 + 5\times 60 + 30=3930\),
Dur_Hour будет равно 1, Dur_Min будет равно 5.
Штрафные баллы не начисляются за задачи, которые в итоге не были сданы на OK, а также штрафные баллы не начисляются за решения, отправленные
после того, как был получен OK по данной задаче. Также в Москве на школьных соревнованиях не учитываются решения, имеющие статус «Ошибка
компиляции», у них значение поля Stat_Short равно CE.
Выведите таблицу результатов командной олимпиады в формате название команды, затем через двоеточие и пробел — число решённых задач и,
через пробел, штрафные баллы. Список должен быть упорядочен по убыванию числа решённых задач, затем по возрастанию штрафного балла, затем по
названию команды.
Пример результата работы программы для данного файла:
42: Борис, (Гурциева B’, Белова B’, Воробьева B’): 9 785
28: Ядреный Хренодер (Смирнов B’, Капленков C, Подопросветов C): 9 1023
39: Easy Win (Самбуров B’, Оспенников B’, Чахвадзе B’): 8 917
34: No money — no honey (Неверова C, Олемская C, Федорова C): 7 496
35: #Альтернатива# (Копаева C, Плюшкин C, Мустафин C): 7 669
26: Новогодний дуб (Винокуров C’, Гусев C’, Соколов C’): 7 726
31: ОАО «Мозгострах» (Карбушев B’, Привалихин B’, Труфанов B’): 7 838
36: Нет идей (Фадеева C’, Серикова C’, Власова C’): 7 857
38: nyan pony (Сидоров B’, Зверева B’, Николаев B’): 7 863
41: Дружба — это магия (Сахабиев C’, Хайруллин C’, Поляков C’): 7 1004
30: Трое на кухне (Воронцова B’, Савон B’, Иглина B’): 6 375
44: Лама (Жуковская C, Цаплин B’, Русина C): 6 464
27: 12348 (Начкин C’, Алехина C’, Якунчева C’): 6 555
37: Чапельник (Чистопольская C, Минеева B’, Дженжер C): 6 573
33: Cone Forest (Алфёров C, Шалимова С, Казаков C): 6 587
32: Тётки (с) (Романова C’, Ерохина C’, Ерохина C’): 6 815
29: python++ (Кириллов C, Амиров C, Аникушин C): 6 1025
43: Двое против всех (Морозов C’, Анопренко C’): 5 190
40: PENTAGRAM (Янцевич C, Соломатин C, Амиров C): 4 444
Наборы данных с сайта mos.ru
В следующих задачах мы будем изучать интересные сведения, которые можно скачать
с сайта data.mos.ru.
- «Победители олимпиад» из раздела «Образование», архив с
данными; - «Сведения о наиболее популярных мужских именах среди новорожденных» из раздела «Справочная информация», архив с данными;
- «Городской Wi-Fi» из раздела «Связь», архив с данными;
D: Городской Wi-Fi
Изучите данные о городском Wi-Fi («Городской Wi-Fi» из раздела «Связь», архив с данными).
CSV-данные на сайте data.mos.ru записаны в кодировке Windows-1251, но в тестирующей системе
этот же файл будет сконвертирован в кодировку UTF-8.
Вы можете скачать файл с данными и сконвертировать его на своём компьютере из кодировки Windows-1251 в кодировку UTF-8,
либо осуществлять перекодировку средствами языка Python при открытии файла, в этом случае в функцию open
нужно передать параметр encoding="cp1251"
. При сдаче задачи в тестирующую систему этот параметр нужно убрать.
Также обратите внимание, что все значения полей в этом файле заключены в кавычки.
Посчитайте для каждого района Москвы количество точек доступа в этом районе.
Упорядочите список по убыванию количества точек доступа, при равном значении —
в лексикографическом порядке названия района. Выведите полученный список, отделяя название
района от числа точек доступа двоеточием и пробелом.
Начальная часть ответа выглядит так:
Тверской район: 480
район Хамовники: 386
Пресненский район: 349
Басманный район: 343
район Замоскворечье: 308
E: Призёры регионального этапа всероссийской олимпиады в 2017/2018 году
Ссылка на архив с данными выше.
Вам необходимо посчитать для каждой московской школы количество победителей и призёров регионального этапа всероссийской олимпиады школьников
в 2017/18 году (региональный этап — это третий этап всероссийской олимпиады).
Необходимо вывести список всех школы Москвы в формате: краткое название школы,
затем через двоеточие и пробел количество победителей регионального этапа из этой школы,
количество призёров регионального этапа, через пробел.
Список упорядочен по убыванию суммарного числа победителей и призёров,
затем по числу победителей, затем по названию школы.
Начало списка выглядит так:
НИУ ВШЭ. лицей: 27 189
Московский государственный университет имени М.В. Ломоносова, МГУ имени М.В. Ломоносова, Московский университет или МГУ: 38 176
ГБОУ школа № 179: 33 164
ГБОУ школа № 1535: 32 157
ГБОУ лицей «Вторая школа»: 33 151
F: Предметы московской олимпиады
Ссылка на архив с данными выше.
Определите, по каким предметам проводится московская олимпиада. Для каждого предмета выведите его название, и сколько лет (начиная с 2012/2013 учебного года)
проводится олимпиада по этому предмету.
Выведите список предметов в алфавитном порядке, затем через двоеточие и пробел, количество лет проведения.
Начало списка выглядит так:
Биология: 6
География: 6
Изобразительное искусство: 6
Иностранный язык (испанский язык): 3
G: «Качество» призёров регионального этапа
Ссылка на архив с данными выше.
Посчитайте для каждой школы коэффициент «качества» призёров регионального этапа:
отношение числа победителей и призёров заключительного этапа этой школы к числу победителей и призёров
регионального этапа. Учитывается только 2017/2018 учебный год, только те школы, в которых
ненулевое число победителей и призёров регионального этапа и ненулевое число победителей и призеров
заключительного этапа.
Упорядочите полученный список по отношению числа победителей и призёров заключительного
этапа к числу победителей и призеров регионального этапа, при равном значении —
в лексикографическом порядке краткого названия школы. Выведите краткое название школы,
затем двоеточие и пробел, затем разделяя пробелами число победителей и призёров регионального этапа,
число победителей и призёров заключительного этапа, отношение.
Понятно, что при такой оценке «качества» порядок школ окажется довольно странным.
Вот начало полученного списка:
ГБОУ «Школа № 2100»: 1 1 1.0
ГБОУ школа № 2072: 1 1 1.0
ГБОУ школа № 2088: 1 1 1.0
ГБОУ школа № 875: 1 1 1.0
ГБОУ школа № 1324: 4 3 0.75
H: Мужские имена — убрать лишние концы строк
Ссылка на архив с данными выше.
Изучите набор данных «Сведения о наиболее популярных мужских именах среди новорожденных»
из раздела «справочная информация».
В этом файле собрана статистика с января 2015 по сентябрь 2018 года, для каждого
месяца приведено 100 наиболее популярных мужских имён.
Этот файл плохо пригоден для обработки, поэтому задача будет решаться в несколько шагов.
Прежде всего обратите внимание, что в некоторых записях после имени идёт символ конца строки до закрывающей кавычки.
Устраните эту проблему. Больше никакой корректировки данных делать не нужно.
Для каждого имени посчитайте суммарное число новорождённых по этим данным. Упорядочите список
имен по убыванию числа детей, а при равных значениях — по имени в лексикографическом порядке.
Выведите полученный список в формате: имя, через двоеточие и пробел — количество детей.
Александр: 12286
Максим: 10606
Михаил: 10373
…
I: Мужские имена — убрать дубликаты
Обратите внимание на то, что некоторые записи содержат такое «имя»,
как «Даниил, Данила, Данил». То есть в некоторых случаях эти имена считаются
раздельно, а в некоторых — вместе, и в этом случае невозможно установить
статистику по каждому из этих имён. Давайте считать, что все три варианта имени
«Даниил», «Данила», «Данил» являются одним и тем же
именем «Даниил», которое указано первым в списке.
Вам необходимо установить все случаи, когда в именах встречаются запятые. Если в имени встречается
запятая, то это означает, что перечислены разные варианты одного и того же имени.
Канонической формой считается форма, которая указана первой. Во всех данных
необходимо осуществить замену всех вариантов имени на каноническую форму (в том числе тех вариантов,
где имена перечислены через запятую). Необходимо осуществить замену дублирующихся имён на каноническую
форму и посчитать статистику после этого.
Александр: 12286
Максим: 10606
Михаил: 10373
…
J: Мужские имена — wat?!
Найдите странное имя, которое начинается со строчной буквы. Вероятно, это ошибка человека, который не
умеет копировать данные между разными файлами и источниками данных, и вбивал информацию руками.
Исправьте эту ошибку, учтите это в программе, которая обрабатывает данные.
Александр: 12286
Максим: 10606
Михаил: 10373
…
K: Мужские имена — среднее значение
Посчитайте для каждого имени среднее число раз, которое это имя даётся новорожденному в месяц.
При этом поскольку за каждый месяц дана статистика только по 100 именам, то по многим именам,
которые не каждый месяц попадают в Top-100, есть данные не по всем месяцам. По таким именам нужно
считать среднее, как число детей, делённое на количество месяцев, по котором есть статистика.
Обратите внимание, что в результате дублирования одной формы написания имени, может быть так, что
в одном месяце одно и то же имя в разных формах повторяется несколько раз.
Результат деления округлите до целого числа вниз. Выведите полученный список в таком же формате,
как в предыдущих задачах.
Александр: 273
Максим: 235
Михаил: 230
…
L: Мужские имена — динамика по времени
Посчитайте, как меняется популярность имени со временем. Сравните среднемесячную частоту появления
каждого имени в 2015 и в 2018 году и посчитайте разницу — насколько изменилось среднемесячное
число новорождённых с этим именем в 2018 году по сравнению с 2015 годом.
Необходимо учитывать только те имена, которые встречались хотя бы раз в 2015 и 2018 году. Среднемесячное
число появлений имени считается, как в предыдущей задаче (среднее по месяцам, с учётом того, что данные
по конкретному имени есть не по всем месяцам, деление с округлением вниз, обратите внимание, что за 2018 год
данные приведены только за 9 месяцев).
Выведите для каждого имени его среднемесячное число появлений в 2015 году, в 2018 году, разницу этих величин.
Упорядочите список по убыванию разницы, при равном значении — по имени.
Начало списка выглядит так:
Лев: 80 108 28
Мирон: 36 61 25
Марк: 100 118 18
Мухаммад: 15 27 12
Амир: 27 37 10
M: Призёры регионального этапа всероссийской олимпиады за три года
Определите школы, в которых было наибольшее число победителей и призёров регионального этапа
всероссийской олимпиады за три последних учебных года (начиная с 2015/2016 учебного года).
Вам нужно найти пять школ, в которых за три года число победителей и призёров было наибольшим.
Сложность этой задачи в том, что названия некоторых школ за это время изменились.
Вам необходимо установить, как менялись названия у разных школ за это время.
Программа должна вывести пять строк, формат вывода аналогичен предыдущей задаче.
Название школы должно быть выведено таким, каким оно было в 2017/2018 учебном году.
Выводимое число победителей и призёров должно быть равно числу победителей и призёров
за три учебных года: 2015/2016, 2016/2017, 2017/2018. Список должен быть упорядочен
по убыванию суммы победителей и призёров.
Вам нужно сначала установить, как менялись названия школ. Таблицу переименования
школ можно непосредственно указать в исходном коде решения, однако количество
победителей и призёров должно считаться автоматически на основании исходных данных.
Первая строка полученного списка должна выглядеть так:
Московский государственный университет имени М.В. Ломоносова, МГУ имени М.В. Ломоносова, Московский университет или МГУ: 84 537
N: Ближайшая точка доступа к школе
Найдите ближайшую к школе № 179 точку доступа городского Wi-Fi. Программа должна вывести
в первой строке адрес этой точки доступа, во второй строке — расстояние до этой точки доступа в метрах.
Для данных на data.mos.ru программа должна вывести следующий результат:
город Москва, Камергерский переулок, дом 4, строение 1
68.41241881965709
Возможно, что программа будет находить не эту точку доступа, а какую-то другую, но тоже близко
расположенную (например, в Георгиевском переулке или на Большой Дмитровке).
CSV (Comma Separated Values) — это формат хранения табличных данных, где значения разделены запятыми. Кодировка файла может быть различной, и иногда возникает необходимость изменить ее на utf-8 для совместимости с другими системами или программами. В этой статье мы рассмотрим, как изменить кодировку csv файла на utf-8 с помощью Python 3.
Python предоставляет мощные инструменты для работы с файлами и кодировками. Для изменения кодировки csv файла на utf-8 мы будем использовать модуль csv и модуль codecs, который предоставляет функции для работы с различными кодировками.
Вначале нам понадобится открыть csv файл и прочитать его содержимое. Затем мы будем использовать функцию codecs.open(), чтобы создать новый файл с указанной кодировкой utf-8. После чего мы запишем прочитанное содержимое в новый файл. В конце не забудьте закрыть оба файла.
import csv
import codecs
with open(‘file.csv’, ‘r’, encoding=’кодировка исходного файла’) as infile:
reader = csv.reader(infile)
data = [row for row in reader]
with codecs.open(‘file_utf8.csv’, ‘w’, encoding=’utf-8′) as outfile:
writer = csv.writer(outfile)
writer.writerows(data)
print(«Кодировка файла успешно изменена на utf-8»)
При использовании данного кода необходимо заменить ‘file.csv’ на имя вашего файла csv и указать кодировку исходного файла (например, ‘Windows-1251’ или ‘UTF-8’). Новый файл с измененной кодировкой будет создан в той же директории с названием ‘file_utf8.csv’.
Теперь, когда вы знаете, как изменить кодировку csv файла на utf-8 с помощью Python 3, вы можете легко привести ваши данные к нужному формату для дальнейшей обработки или использования.
Содержание
- Выгрузка данных в csv файл
- Знакомство с кодировками
- Шаги по изменению кодировки
- Открытие csv файла в Python
- Чтение данных из файла
- Изменение кодировки
- Сохранение изменений
- Вопрос-ответ
Выгрузка данных в csv файл
csv (Comma Separated Values) — это текстовый файл, содержащий данные, разделенные запятыми или другими символами для их организации в столбцы и строки. Этот формат широко используется для обмена данными между различными программами и позволяет легко записывать и считывать данные.
В Python есть несколько способов выгрузки данных в csv файл:
- Использование встроенного модуля csv.
- Использование модуля Pandas.
- Использование модуля numpy.
1. Использование встроенного модуля csv:
Для записи данных в csv файл с использованием модуля csv в Python требуется выполнить следующие шаги:
- Открыть csv файл в режиме записи с помощью функции open().
- Создать объект writer с помощью функции csv.writer().
- Использовать метод writerow() объекта writer для записи каждой строки в файл.
- Закрыть файл с помощью метода close().
Пример:
import csv
data = [
['Имя', 'Возраст', 'Email'],
['Иван', 25, 'ivan@example.com'],
['Мария', 30, 'maria@example.com'],
['Петр', 35, 'petr@example.com']
]
filename = 'data.csv'
with open(filename, 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerows(data)
print(f'Данные успешно записаны в файл {filename}.')
2. Использование модуля Pandas:
Модуль Pandas предоставляет более высокоуровневые возможности для работы с данными, в том числе и для записи данных в csv файл. Для выполнения записи данных в csv файл с использованием модуля Pandas следуйте этим шагам:
- Импортируйте модуль pandas.
- Создайте объект DataFrame из ваших данных.
- Используйте метод to_csv() объекта DataFrame для записи данных в csv файл.
Пример:
import pandas as pd
data = {
'Имя': ['Иван', 'Мария', 'Петр'],
'Возраст': [25, 30, 35],
'Email': ['ivan@example.com', 'maria@example.com', 'petr@example.com']
}
df = pd.DataFrame(data)
filename = 'data.csv'
df.to_csv(filename, index=False, encoding='utf-8')
print(f'Данные успешно записаны в файл {filename}.')
3. Использование модуля numpy:
Модуль numpy предоставляет функциональность для работы с массивами данных. Для записи массива данных в csv файл с использованием модуля numpy выполните следующие шаги:
- Импортируйте модуль numpy.
- Создайте массив данных.
- Используйте функцию savetxt() модуля numpy для сохранения данных в csv файл.
Пример:
import numpy as np
data = np.array([
['Имя', 'Возраст', 'Email'],
['Иван', 25, 'ivan@example.com'],
['Мария', 30, 'maria@example.com'],
['Петр', 35, 'petr@example.com']
])
filename = 'data.csv'
np.savetxt(filename, data, delimiter=',', fmt='%s', encoding='utf-8')
print(f'Данные успешно записаны в файл {filename}.')
При использовании любого из этих методов убедитесь, что вы указываете правильную кодировку (например, utf-8) при записи в csv файл, чтобы сохранить русские символы и другие специальные символы корректно.
Знакомство с кодировками
Кодировки — это способы представления символов в компьютерах. Они определяют соответствие между символами и числовыми кодами, которые используются для их представления и хранения на устройствах хранения информации.
В компьютерных системах существует множество различных кодировок, каждая из которых имеет свои особенности и применение. Некоторые из наиболее распространенных кодировок:
- ASCII — American Standard Code for Information Interchange (Американский стандартный код обмена информацией). Широко используется для представления символов латинского алфавита и базовых символов пунктуации. ASCII использует 7-битные коды и может представить всего 128 символов.
- UTF-8 — Unicode Transformation Format (Формат преобразования Юникода). UTF-8 представляет символы из Юникода (стандарта для представления символов различных систем письма) и является наиболее распространенной кодировкой в современных компьютерных системах. UTF-8 использует переменное количество байт для кодирования символов, что позволяет представить практически все символы, включая символы различных письменностей и специальные символы.
- CP1251 — Code Page 1251 (Страница кодировки 1251), также известный как «Windows-1251». Это одна из наиболее распространенных кодировок символов кириллицы (русского алфавита), используемых в операционных системах на основе Windows.
Когда мы работаем с текстом, важно учитывать кодировку того, с чем мы работаем. Если текст сохранен в неправильной кодировке, некоторые символы могут быть неправильно интерпретированы, отображаться неправильно или потеряны вообще.
Python предоставляет различные инструменты для работы с различными кодировками. Например, для изменения кодировки csv файла на utf-8, можно использовать стандартную библиотеку CSV Python с указанием правильной кодировки.
Кодировка | Описание |
---|---|
ASCII | Кодировка, которая представляет латинский алфавит и базовые символы пунктуации. |
UTF-8 | Uniсode Transformation Format, наиболее распространенная кодировка в современных компьютерных системах. |
CP1251 | Code Page 1251, использованная в операционных системах на основе Windows. |
Важно понимать разницу между различными кодировками и использовать правильную кодировку для обработки текста в своих программах.
Шаги по изменению кодировки
Если вам нужно изменить кодировку csv файла на utf-8 с помощью Python 3, следуйте этим шагам:
- Импортируйте модули csv и codecs:
- Откройте исходный csv файл в режиме чтения и задайте кодировку:
- Прочитайте содержимое файла и сохраните его в переменную:
- Откройте новый csv файл для записи и задайте кодировку utf-8:
- Создайте объект для записи данных в новый файл:
- Проходите по каждой строке данных в исходном файле:
import csv
import codecs
with open('input.csv', 'r', encoding='старая_кодировка') as file:
csv_data = file.readlines()
with open('output.csv', 'w', encoding='utf-8') as file:
writer = csv.writer(file)
for line in csv_data:
# Для каждой строки создайте список значений, разделенных запятыми
row = line.strip().split(',')
# Запишите этот список в новый файл
writer.writerow(row)
После выполнения этих шагов у вас будет новый csv файл с измененной кодировкой на utf-8.
Открытие csv файла в Python
В языке программирования Python есть несколько способов открыть csv файл для чтения или записи данных. Одним из наиболее распространенных способов является использование стандартной библиотеки csv.
Для начала необходимо импортировать модуль csv, добавив следующую строку в ваш код:
import csv
После импорта можно начать работу с csv файлом. Но перед этим необходимо открыть файл с использованием функции open(). В качестве аргументов передаются название файла и режим открытия.
Режимы открытия файлов в Python могут быть следующими:
- r — для чтения (по умолчанию)
- w — для записи
- a — для добавления (добавления данных в конец файла)
- x — для создания нового файла
Пример открытия csv файла для чтения:
with open('file.csv', 'r') as csv_file:
reader = csv.reader(csv_file)
for row in reader:
print(row)
В данном примере файл с названием «file.csv» открывается для чтения и используется функция csv.reader() для чтения данных из файла. Затем данные выводятся на экран с помощью цикла for.
Также вы можете открыть csv файл для записи данных с использованием функции csv.writer(). Пример записи данных в csv файл:
with open('file.csv', 'w') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(['Столбец 1', 'Столбец 2', 'Столбец 3'])
writer.writerow(['Данные 1', 'Данные 2', 'Данные 3'])
В данном примере файл с названием «file.csv» открывается для записи и используется функция csv.writer() для записи данных в файл. Затем с помощью функции writerow() записываются строки данных.
Таким образом, с помощью модуля csv в Python можно легко открыть и работать с csv файлами, как для чтения, так и для записи данных.
Чтение данных из файла
Для работы с данными из файла в формате CSV в Python 3 сначала необходимо открыть файл с помощью функции open()
и указать режим доступа 'r'
(только для чтения).
Например, предположим, что у нас есть файл с именем data.csv
, который содержит следующие данные:
Имя | Возраст | Город |
---|---|---|
Анна | 25 | Москва |
Иван | 30 | Санкт-Петербург |
Елена | 35 | Новосибирск |
Мы можем прочитать данные из этого файла, используя следующий код:
import csv
with open('data.csv', 'r') as file:
reader = csv.reader(file)
for row in reader:
print(row)
В этом примере мы импортируем модуль csv
и открываем файл data.csv
в режиме чтения. Затем мы создаем объект reader
, используя функцию csv.reader()
и проходим через каждую строку файла, выводя ее содержимое с помощью команды print()
.
В результате выполнения этого кода будут выведены следующие строки:
- [‘Имя’, ‘Возраст’, ‘Город’]
- [‘Анна’, ’25’, ‘Москва’]
- [‘Иван’, ’30’, ‘Санкт-Петербург’]
- [‘Елена’, ’35’, ‘Новосибирск’]
Обратите внимание, что функция csv.reader()
автоматически разбивает строки файла на отдельные значения, используя символ разделителя (по умолчанию это запятая).
Чтобы изменить символ разделителя или другие параметры чтения файла CSV, вы можете передать соответствующие аргументы в функцию csv.reader()
. Например, чтобы указать, что разделителем является точка с запятой, вы можете использовать следующий код:
import csv
with open('data.csv', 'r') as file:
reader = csv.reader(file, delimiter=';')
for row in reader:
print(row)
В этом примере мы передаем аргумент delimiter=';'
в функцию csv.reader()
, чтобы указать, что разделителем является точка с запятой.
Таким образом, чтение данных из файла CSV в Python 3 является относительно простой операцией, которую можно выполнить с помощью модуля csv
и некоторых базовых команд языка.
Изменение кодировки
Кодировка — это способ представления символов в компьютерных системах. Она определяет соответствие между последовательностью битов и символом. Изменение кодировки часто требуется при работе с различными типами данных, особенно при импорте или экспорте текстовых файлов. В данной статье мы рассмотрим, как изменить кодировку csv файла на UTF-8 с использованием Python 3.
Python имеет встроенные инструменты для работы с различными кодировками текста. Для изменения кодировки csv файла на UTF-8 мы будем использовать модуль csv и модуль codecs.
- Откройте csv файл с помощью функции open и укажите режим чтения исходного файла и режим записи нового файла.
- Используя модуль csv, прочитайте содержимое исходного файла и сохраните его в переменной.
- Создайте новый csv файл и укажите его кодировку как UTF-8.
- Используя цикл, запишите содержимое исходного файла в новый файл, преобразовав его в нужную кодировку.
Вот пример кода:
import csv
import codecs
# Открываем исходный csv файл и создаем новый csv файл
with codecs.open('input.csv', 'r', encoding='сurrent_encoding') as file_in, \
codecs.open('output.csv', 'w', encoding='utf-8') as file_out:
# Создаем объект модуля csv для чтения и записи
csv_reader = csv.reader(file_in, delimiter=',')
csv_writer = csv.writer(file_out, delimiter=',')
# Записываем содержимое из исходного файла в новый файл, изменяя кодировку
for row in csv_reader:
csv_writer.writerow([cell.encode('utf-8') for cell in row])
В этом примере мы использовали модуль csv для чтения и записи содержимого csv файла. Мы также использовали модуль codecs для указания кодировки файла. В результате, кодировка исходного файла была изменена на UTF-8.
Теперь вы знаете, как изменить кодировку csv файла на UTF-8 с использованием Python 3. Это может быть полезно при работе с текстовыми данными, особенно если ваши данные содержат символы, отличные от стандартного набора ASCII.
Сохранение изменений
После того как мы произвели необходимые изменения в кодировке csv файла на utf-8, нам необходимо сохранить измененный файл. Для этого в Python 3 мы можем использовать функцию to_csv из модуля pandas.
Для начала, нам необходимо импортировать модуль pandas:
import pandas as pd
Далее, мы можем использовать функцию to_csv для сохранения измененного файла. Функция принимает несколько параметров:
- path_or_buf: путь к файлу, в который нужно сохранить данные.
- sep: разделитель полей в файле, по умолчанию запятая.
- na_rep: строка-замена для пропущенных значений, по умолчанию пустая строка.
- index: указывает нужно ли сохранять индексы, по умолчанию True.
- encoding: кодировка, в которой нужно сохранить данные. В нашем случае это «utf-8».
Пример использования функции to_csv:
df.to_csv("output.csv", sep=",", index=False, encoding="utf-8")
В данном примере мы сохраняем измененный файл с именем «output.csv» с разделителем полей «,» и без сохранения индексов.
После выполнения кода, измененный файл будет сохранен с указанными параметрами и новой кодировкой utf-8.
Теперь, вы можете использовать полученный файл с кодировкой utf-8 для дальнейшей обработки данных или открытия в других программных приложениях.
Вопрос-ответ
0 Пользователей и 1 Гость просматривают эту тему.
- 2 Ответов
- 8448 Просмотров
Навеяно, не помню каким постом, с нулледа. Некоторое время думал, стоит ли создавать новую тему. Решил-таки создать.
Наверное, многие сталкивались с необходимостью перекодировки исходящего из 1с файла загрузки. Кто-то делал это с помощью OpenOffice Calc, заодно подправляя что-либо, кто-то Notepad++, кто-то командой $enconv file.csv, короче — кто чем.
А можно сделать так:
Открываем файл (предварительно сделав копию) /administrator/components/com_csvimproved/helpers/csvi_class_file.php в текстовом редакторе.
Ищем строчки
if ($csvdata) { /* Do BOM check */
if (JRequest::getVar('currentline') == 1) {
/* Remove text delimiters as they are not recognized by fgetcsv */
$csvdata[0] = str_replace($template->text_enclosure, "", $this->CheckBom($csvdata[0]));
}
foreach ($csvdata as $key => $value) {
$newdata[$key+1] = $value;
}
return $newdata;
}
else {
$this->CloseFile();
return false;
}
break;
Меняем их на
if ($csvdata) {
/* Do BOM check */
if (JRequest::getVar('currentline') == 1) {
/* Remove text delimiters as they are not recognized by fgetcsv */
$csvdata[0] = str_replace($template->text_enclosure, "", $this->CheckBom($csvdata[0]));
}
foreach ($csvdata as $key => $value) {
$newdata[$key+1] = $value;
$newdata[$key+1] = iconv('CP1251','UTF-8',$newdata[$key+1]);
}
return $newdata;
}
else {
$this->CloseFile();
return false;
}
break;
Сохраняем файл. Пробуем.
У меня получилось.
PS Возможно, изменяемый код будет немножко отличаться от того, что написал я — в зависимости от версии. Главное знать начало замены ( if ($csvdata) {
/* Do BOM check */ ) и конец ( break; )
« Последнее редактирование: 14.12.2010, 21:05:42 от Erepb »
Записан
Навеяно, не помню каким постом, с нулледа. Некоторое время думал, стоит ли создавать новую тему. Решил-таки создать.
Наверное, многие сталкивались с необходимостью перекодировки исходящего из 1с файла загрузки. Кто-то делал это с помощью OpenOffice Calc, заодно подправляя что-либо, кто-то Notepad++, кто-то командой $enconv file.csv, короче — кто чем.
А можно сделать так:
Открываем файл (предварительно сделав копию) /administrator/components/com_csvimproved/helpers/csvi_class_file.php в текстовом редакторе.
Ищем строчкиif ($csvdata) {
/* Do BOM check */
if (JRequest::getVar('currentline') == 1) {
/* Remove text delimiters as they are not recognized by fgetcsv */
$csvdata[0] = str_replace($template->text_enclosure, "", $this->CheckBom($csvdata[0]));
}
foreach ($csvdata as $key => $value) {
$newdata[$key+1] = $value;
}
return $newdata;
}
else {
$this->CloseFile();
return false;
}
break;
Меняем их на
if ($csvdata) {
/* Do BOM check */
if (JRequest::getVar('currentline') == 1) {
/* Remove text delimiters as they are not recognized by fgetcsv */
$csvdata[0] = str_replace($template->text_enclosure, "", $this->CheckBom($csvdata[0]));
}
foreach ($csvdata as $key => $value) {
$newdata[$key+1] = $value;
$newdata[$key+1] = iconv('CP1251','UTF-8',$newdata[$key+1]);
}
return $newdata;
}
else {
$this->CloseFile();
return false;
}
break;Сохраняем файл. Пробуем.
У меня получилось.PS Возможно, изменяемый код будет немножко отличаться от того, что написал я — в зависимости от версии. Главное знать начало замены ( if ($csvdata) {
/* Do BOM check */ ) и конец ( break; )
Спасибо! У меня тож получилось!У меня CSVImproved 1.9.
не совсем понял кодировка осталась какая и была, хотя нужно чтоб выгружал и загружал в utf8