Форум сайта python.su
Столкнулся с проблемой чтения / записи файлов в CSV формате.
Python ver. 3.6.1
matplotlib ver. 2.0.2
numpy ver. 1.13.0rc1
Пример из документации к matplotlib 2.0.2:
import matplotlib.mlab as mplab import numpy as np r = mplab.csv2rec('somefile.csv', checkrows=0) formatd = dict( weight = mplab.FormatFloat(2), change = mplab.FormatPercent(2), cost = mplab.FormatThousands(2), ) mplab.rec2csv(r, 'test.csv', formatd=formatd)
Офлайн
ViktorRПохоже, что в mlab ошибка какая-то, так как нормальный csv-файл преобразуется в массив записей numpy, а потом для этого массива даже rec2txt() не работает.
Есть ли у кого рабочий пример с функциями rec2csv() и csv2rec()
Офлайн
py.user.next
Похоже, что в mlab ошибка какая-то
Отредактировано scidam (Июнь 26, 2017 02:55:00)
Офлайн
scidam,
На втором питоне сработал код из первого сообщения, а на третий питон они его не допортировали, видимо.
Отредактировано py.user.next (Июнь 26, 2017 03:38:56)
Офлайн
Спасибо за пояснения и рекомендацию.
Установил pandas.
Будем продолжать исследование новых земель …
Офлайн
scidam
csv тоже будет работать если во writer подавать файл, открытый без ‘b’ аттрибута…
import csv input_file = open("pr.csv", "r") rdr = csv.reader(input_file) output_file = open("pr1.csv", "w") wrtr = csv.writer(output_file) for rec in rdr: try: rec[1] = int(rec[1]) + 1 except: pass wrtr.writerow(rec) input_file.close() output_file.close()
Прикреплённый файлы: pr1.png (14,6 KБ)
Офлайн
Попробуйте в коде использовать такой вариант для csv writer`a
wrtr = csv.writer(output_file, lineterminator='\n')
Офлайн
В формате CSV строки должны заканчиваться на CRLF в любой системе и в любых программах. Поэтому при открытии таких файлов в питоне используют бинарный режим rb и wb, так как текстовый режим r и w может изменять концы строк. Ты можешь открыть csv-файл в текстовом режиме, только если есть гарантия, что при записи прочитанных данных будут правильные концы строк.
То есть, скорее всего, ты прочитал данные в бинарном режиме, а сохраняешь их обратно потом в текстовом. Поэтому при чтении все символы сохранились неизменными \r\n, а при записи \n преобразовался в \r\n. Сделай так, чтобы при чтении и записи режим был одинаковый.
Офлайн
py.user.next
Сделай так, чтобы при чтении и записи режим был одинаковый.
Открываем Пишем Результат r w # см. выше r wt # --"-- r wb # TypeError: a bytes-like object is required, not 'str' rt w # аналогично первому варианту rt wb # TypeError: a bytes-like object is required, not 'str' rt wt # аналогично первому варианту rb (xx) # _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
Отредактировано ViktorR (Июнь 27, 2017 09:54:40)
Офлайн
ViktorRФайл какой вводишь?
r w # см. выше
ViktorRОни читают через обычный файловый read() и пишутся через обычный файловый write() внутри csv, и вот в этих методах и происходят преобразования текстового режима (не только концы строк). Функции модуля csv никак на это не влияют. При чтении в текстовом режиме CRLF преобразуется в LF, а при записи в текстовом режиме LF преобразуется в CRLF (это для винды). Внутри питона у тебя LF. Но когда файл открывается в бинарном режиме, тогда все преобразования отменяются и байты читаются и пишутся так, как они хранятся. Если там LF, то прочитается LF, если там CRLF, то прочитается CRLF, так как в байтовом режиме нет понятия строк в файле, есть просто поток байт. То же самое при записи обратно - что пишется, то и пишется.
2) Так понимаю, что при чтении данных из файла концы строк (CRLF) обрезаются.
ViktorRПри записи может добавляться CR, когда это на маке происходит.
3) При записи в файл в хвост строк добавляется CR (\r), а при записи в текстовом режиме и CRLF.
Отредактировано py.user.next (Июнь 27, 2017 13:44:03)
Офлайн