Найти - Пользователи
Полная версия: Запись в CSV файл
Начало » Python для новичков » Запись в CSV файл
1 2 3
exister
У меня стоит задача написать скрипт, который принимает 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=';'

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

doza_and
exister
Эксель не понимает кодировку, вместо кириллицы отображает левые символы
Так что вы сюда пишете? Пишите в техподдежку Микрософта.
У меня Libreoffice без проблем и сразу открывает файлы в кодировке utf-8. Да и у exel нет проблем если данные импортировать а не просто давать команду открыть файл.
py.user.next
Ты можешь формировать xls-файл из csv-файла с помощью питона.
JOHN_16
я в работе по возможности отказался от CSV по этой причине - пользователи на Винде в экселе имеют проблемы. В итоге делаю xlsx файл, благо это не сильно сложнее - есть библиотеки в достатке.
py.user.next
JOHN_16
я в работе по возможности отказался от CSV по этой причине
У меня многие базы в CSV лежат, но это не на сервере, а после скрапинга. Почему? А потому что я часто по ним grep делаю, когда что-то найти надо. Ни sqlite, ни файлы какие-то не дадут такой мощи (база не одна и не в одной директории).
FishHook
py.user.next
Ни sqlite, ни файлы какие-то не дадут такой мощи
Ну ясно же каждому, что sql придумали потому, что не умели грепать!!!
doza_and
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/
exister
doza_and
Так что вы сюда пишете? Пишите в техподдежку Микрософта.
Когда я брал данные для теста из словаря, то передавал их в CSV в кодировке cp1251, а не Unicode - тогда Эксель все отображал корректно. Но прикрутить cp1251 к моему AJAX запросу я уже не смог. Более того, мне кажется, что надо по хорошему с Юникодом и работать, а не конвертировать туда-сюда, нет?

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

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

По этой причине я хочу работать с CSV - это нативный и быстрый инструмент.
doza_and
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 один из наихудших форматов для хранения больших объемов данных.
JOHN_16
doza_and
Так тут это не проблема формата CSV и даже не проблема exel.
я знаю. Но дешевле сделать xlsx чем менеджерам объяснять и слушать их недовольство. Серьезно =) тут не техническая проблема…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB