Форум сайта python.su
Здравствуйте. Подскажите, как сделать чтение из файла csv?
import csv reader = csv.reader(open("autobelarus.csv", "rb")) for row in reader: print(row)
Офлайн
import csv reader = csv.reader(open("autobelarus.csv", "r")) for row in reader: print(row)
Офлайн
мда… Я прям вот не знаю что и сказать.. Вот прям смотрю и грустно.
Franek
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
FranekВам вот прям прямым текстом пишут - а Вы точно открыли файл в текстовом режиме,? Точно ???
did you open the file in text mode?
Franekда нифига не в текстовом, надо
reader = csv.reader(open(“autobelarus.csv”, “rb”))
Franek
reader = csv.reader(open(“autobelarus.csv”, “r”))
FranekНу вот это прям вообще капец. Если в гугл ввести даже по русски “Питон документация csv” то в первой десятке будет ссылка на документацию.
И ещё, скажите, по этому модулю документация есть?
Офлайн
Franekой надо же, какая редкая проблема…прям хоть Гвидо подключай (создателя языка)
UnicodeDecodeError: ‘charmap’ codec can't decode byte 0x98 in position 53: character maps to <undefined>
Franekкодировку текста указать надо
open(“autobelarus.csv”, “r”, encoding=“utf-8”)
Офлайн
JOHN_16
Уже разобрался, что дело в кодировке. Но спасибо за подсказку. (Да, с английским у меня проблема, не спорю)
Офлайн
Подскажите, из файла csv можно получить данные отдельных столбцов? Если можно, то как?
Офлайн
в цикле считываете строку, берете значение из нужного столбца, записываете в отдельный список - по окончании цикла работаете с этим списком
Офлайн
Franek
Подскажите, из файла csv можно получить данные отдельных столбцов? Если можно, то как?
>>> csvfile = [['a1', 'b1', 'c1'], ... ['a2', 'b2', 'c2'], ... ['a3', 'b3', 'c3'], ... ['a4', 'b4', 'c4'], ... ['a5', 'b5', 'c5']] >>> >>> col2 = [i[1] for i in csvfile] >>> col2 ['b1', 'b2', 'b3', 'b4', 'b5'] >>>
>>> def get_column(csvdata, colnum): ... return [i[colnum - 1] for i in csvdata] ... >>> csvfile = [['a1', 'b1', 'c1'], ... ['a2', 'b2', 'c2'], ... ['a3', 'b3', 'c3'], ... ['a4', 'b4', 'c4'], ... ['a5', 'b5', 'c5']] >>> >>> col1 = get_column(csvfile, 1) >>> col2 = get_column(csvfile, 2) >>> col3 = get_column(csvfile, 3) >>> >>> col1 ['a1', 'a2', 'a3', 'a4', 'a5'] >>> col2 ['b1', 'b2', 'b3', 'b4', 'b5'] >>> col3 ['c1', 'c2', 'c3', 'c4', 'c5'] >>>
Отредактировано py.user.next (Дек. 4, 2016 02:24:51)
Офлайн
py.user.next
JOHN_16
Спасибо, работает. Я думал, что цикл for перебирает по отдельным элементам (словам) только список или кортеж , но не строку. Насколько я понял, модуль csv возвращает строки. Думал, что строку цикл перебирает только по символам.
Офлайн
FranekИ строку for перебирает тоже. Цикл for использует функцию iter() для перебора. А функция iter() вызывает метод __iter__() у объекта.
Я думал, что цикл for перебирает по отдельным элементам (словам) только список или кортеж , но не строку.
>>> 'abc'.__iter__ <method-wrapper '__iter__' of str object at 0xb74b16a0> >>> >>> it = 'abc'.__iter__() >>> it <str_iterator object at 0xb74013ac> >>> >>> next(it) 'a' >>> next(it) 'b' >>>
FranekМодуль ничего не возвращает, он предоставляет функции и классы для работы с форматом csv (вообще, с форматом dsv). А вот функция csv.reader() возвращает объект, у которого есть метод __iter__() . И этот метод __iter__() возвращает итератор по разделённым строкам.
Насколько я понял, модуль csv возвращает строки.
>>> import csv >>> >>> reader = csv.reader(open('/etc/passwd'), delimiter=':') >>> reader <_csv.reader object at 0xb740ce9c> >>> >>> it = reader.__iter__() >>> it <_csv.reader object at 0xb740ce9c> >>> >>> next(it) ['root', 'x', '0', '0', 'root', '/root', '/bin/bash'] >>> next(it) ['bin', 'x', '1', '1', 'bin', '/bin', '/sbin/nologin'] >>>
>>> it.__next__() ['daemon', 'x', '2', '2', 'daemon', '/sbin', '/sbin/nologin'] >>>
Отредактировано py.user.next (Дек. 4, 2016 15:40:17)
Офлайн