Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 15, 2017 22:43:25

exister
От: Minsk
Зарегистрирован: 2017-08-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись в CSV файл

У меня стоит задача написать скрипт, который принимает AJAX запрос с данными пользователя и заносит их в CSV-файл, который потом будет скачиваться и открываться MS Excel.

Вот такой запрос:

            $.ajax({
                type: "POST",
                url: "iotest.py",
                data: {
                    action: 'writePlayer',
                    dataScore: dataScore,
                    dataName: dataName,
                    dataSurname: dataSurname,
                    dataPhone: dataPhone,
                    dataEmail: dataEmail
                },
                success: function (response) {
                    console.log("Готово " + response)
                }
            });

И вот мой скрипт:

 #!/usr/bin/python3.4
import cgi
import csv
print("Content-type: text/html\n\n")
form = cgi.FieldStorage()
dataFile = "db.csv"
with open(dataFile, 'a', newline='', encoding='utf-8') as csvfile:
	fieldnames = ['dataName', 'dataSurname', 'dataScore', 'dataPhone', 'dataEmail']
	writer = csv.DictWriter(csvfile, fieldnames=fieldnames, dialect='excel')
	writer.writerow({'dataName': form['dataName'].value,
					 'dataSurname': form['dataSurname'].value,
					 'dataScore': form['dataScore'].value,
					 'dataPhone': form['dataPhone'].value,
					 'dataEmail': form['dataEmail'].value})

У меня следующие проблемы с этим скриптом:
1) Эксель не понимает кодировку, вместо кириллицы отображает левые символы. Я очень долго добивался того, чтобы в CSV отображалась Unicode кириллица, но Эксель все равно ее не осилил.
2) Мне нужно, чтобы данные были разбиты по ячейкам, вот так:



А сейчас у меня все выглядит вот так:



Прошу вашей помощи с этой проблемой.

UPD Задача решена!

1) Благодаря наводке doza_and на эту статью на хабре я выяснил, что Эксель хочет видеть CSV в кодировке Windows-1251

Дело за малым - сразу открывать файл с нужной кодировкой:
 with open(dataFile, 'a', newline='', encoding='cp1251')

2) Чтобы понять как Эксель представляет себе столбики, я создал в нем файл, сохранил его в CSV и открыл блокнотом++
Оказалось, что столбики разделяются между собой знаком “;”. Так что методу записи нужно всего-то добавить параметр
  delimiter=';'

К слову, в статье на хабре тоже было сказано “разделители — точка с запятой (не запятая!)”, но я этому не придал значения, когда читал.

Отредактировано exister (Авг. 16, 2017 14:02:12)

Офлайн

#2 Авг. 15, 2017 23:22:26

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запись в CSV файл

exister
Эксель не понимает кодировку, вместо кириллицы отображает левые символы
Так что вы сюда пишете? Пишите в техподдежку Микрософта.
У меня Libreoffice без проблем и сразу открывает файлы в кодировке utf-8. Да и у exel нет проблем если данные импортировать а не просто давать команду открыть файл.



Отредактировано doza_and (Авг. 15, 2017 23:22:52)

Офлайн

#3 Авг. 16, 2017 00:57:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Запись в CSV файл

Ты можешь формировать xls-файл из csv-файла с помощью питона.



Офлайн

#4 Авг. 16, 2017 00:58:12

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Запись в CSV файл

я в работе по возможности отказался от CSV по этой причине - пользователи на Винде в экселе имеют проблемы. В итоге делаю xlsx файл, благо это не сильно сложнее - есть библиотеки в достатке.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Авг. 16, 2017 01:10:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Запись в CSV файл

JOHN_16
я в работе по возможности отказался от CSV по этой причине
У меня многие базы в CSV лежат, но это не на сервере, а после скрапинга. Почему? А потому что я часто по ним grep делаю, когда что-то найти надо. Ни sqlite, ни файлы какие-то не дадут такой мощи (база не одна и не в одной директории).



Отредактировано py.user.next (Авг. 16, 2017 01:11:22)

Офлайн

#6 Авг. 16, 2017 05:42:29

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Запись в CSV файл

py.user.next
Ни sqlite, ни файлы какие-то не дадут такой мощи
Ну ясно же каждому, что sql придумали потому, что не умели грепать!!!



Офлайн

#7 Авг. 16, 2017 07:49:44

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запись в CSV файл

JOHN_16
отказался от CSV по этой причине - пользователи на Винде в экселе имеют
проблемы
Так тут это не проблема формата CSV и даже не проблема exel. Это пользователи не умеют инструменты использовать. Я им советую просто взять мозг в кулак и прочитать документацию как данные импортируются. Если мозга не хватает для того чтобы научиться пользоваться exel возьми инструмент устроенный логичнее, например Libreoffice.

FishHook
Ну ясно же каждому, что sql придумали потому, что не умели грепать!!!

:):)
Ну тут вопрос xls vs csv а не sql vs csv.
Зависит от способа использования. CSV компактнее, переносимый между разными платформами, стабильный, проще программно использовать, намного эффективнее в операциях слияния и дописывания данных.

xls - Легко грузится в exel, формат позволяет хранить намного больше бантиков, цвета ячеек, формулы, много таблиц в одном файле и т. п.

Т.е. Когда требуются бантики, сразу надо делать xlsx, в противном случае всегда целесообразно хранение в CSV. Если вы добры к пользователям, то сделайте им макрос для загрузки в xlsx и выгрузки назад в CSV.

p.s.
Мой опыт показывает что основная проблема не в том что Кодировки слетают, а том что ексель умный сам додумывает что надо с данными делать.

Можно посмотреть например https://habrahabr.ru/company/mailru/blog/129476/



Офлайн

#8 Авг. 16, 2017 08:11:41

exister
От: Minsk
Зарегистрирован: 2017-08-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись в CSV файл

doza_and
Так что вы сюда пишете? Пишите в техподдежку Микрософта.
Когда я брал данные для теста из словаря, то передавал их в CSV в кодировке cp1251, а не Unicode - тогда Эксель все отображал корректно. Но прикрутить cp1251 к моему AJAX запросу я уже не смог. Более того, мне кажется, что надо по хорошему с Юникодом и работать, а не конвертировать туда-сюда, нет?

py.user.next
Ты можешь формировать xls-файл из csv-файла с помощью питона.
У меня CGI скрипт, я уже подключал Google Sheets, но этим вариантом пользоваться нельзя, т.к. скрипт исполняется около 3 секунд, что просто нереально долго и неприемлемо в случае, если одновременно несколько пользователей заполняют форму. Честно говоря, Экселевские библиотеки я не подключал, но уверен, что они будут такие же медленные, как Гугловские.

Мне нужно писать только текстовые данные, никаких свиспоперделок.

По этой причине я хочу работать с CSV - это нативный и быстрый инструмент.

Офлайн

#9 Авг. 16, 2017 08:54:33

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запись в CSV файл

exister
их в CSV в кодировке cp1251, а не Unicode
Вам надо разобраться с вопросами кодировок. Скорее всего не unicode а utf-8 ну или может utf-16 это ну вообще никак не unicode.

Да, вы правы сейчас есть тенденция перехода на utf-8.

exister
Когда я брал данные для теста из словаря, то передавал их в CSV в кодировке cp1251, а не Unicode - тогда Эксель все отображал корректно.

Я вам уже написал, вы просто не умеете правильно импортировать данные, читайте документацию именно Данные - импорт. В случае cp1251 все более или менее хорошо потому что это совпадает с настройками импорта по умолчанию. Я не фанат exel. Сами выбрали кривой инструмент вы за этот выбор и отвечаете. Сами с ним и разбирайтесь.

Я бы посоветовал действовать в следующем порядке.

1 понять и изложить на бумаге что вам нужно от exel, может в него и не надо данные импортировать.
2 если не нужен, вопрос закрыт, если нужен, то надо понять насколько сложные данные.
3 если данные простые, то просто научитесь делать импорт.
4 Если данные сложные то надо сразу совать их в xlsx. Это будет сложно и болезненно, но генерация xlsx в питоне довольно быстрая процедура, только надо пользоваться не win32com а инструментами записи прямо в xlsx документ. Ну и тогда надо смириться что это все равно будет тормознутая процедура. Ее ни на одном языке Быстрой не сделаешь. xlsx это zip архив в котором находится множество xml файлов. По любому надо все распаковать, потом надо все что получилось распарсить xml парсером, Модифицировать дерево, потом все назад, записать, упаковать…

Пока я придерживаюсь мнения что xlsx один из наихудших форматов для хранения больших объемов данных.



Отредактировано doza_and (Авг. 16, 2017 08:59:01)

Офлайн

#10 Авг. 16, 2017 10:21:59

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Запись в CSV файл

doza_and
Так тут это не проблема формата CSV и даже не проблема exel.
я знаю. Но дешевле сделать xlsx чем менеджерам объяснять и слушать их недовольство. Серьезно =) тут не техническая проблема…



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version