Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 3, 2016 10:41:25

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль csv

Здравствуйте. Подскажите, как сделать чтение из файла csv?

 import csv
reader = csv.reader(open("autobelarus.csv", "rb"))
for row in reader:
    print(row)
Выдаёт ошибку:
Traceback (most recent call last):
File “EPYTHON/Мои программы/11.py”, line 3, in <module>
for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
И ещё, скажите, по этому модулю документация есть?

Офлайн

#2 Дек. 3, 2016 10:53:25

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль csv

 import csv
reader = csv.reader(open("autobelarus.csv", "r"))
for row in reader:
    print(row) 
Чтение из файла (первом сообщении стоял режим rb)

Выдаёт ошибку:
Traceback (most recent call last):
File “EPYTHON/Мои программы/11.py”, line 3, in <module>
for row in reader:
File “C:\Python\lib\encodings\cp1251.py”, line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)
UnicodeDecodeError: ‘charmap’ codec can't decode byte 0x98 in position 53: character maps to <undefined>

Офлайн

#3 Дек. 3, 2016 10:53:40

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

Модуль csv

мда… Я прям вот не знаю что и сказать.. Вот прям смотрю и грустно.

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” то в первой десятке будет ссылка на документацию.
И если Вы не знали - по Питону есть официальная, самая полная документация, включая стандартный модуль CSV но как я могу предположить у вас с английским проблемы планетарного масштаба.



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

Офлайн

#4 Дек. 3, 2016 10:55:42

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

Модуль 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”)
кодировку текста указать надо



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

Офлайн

#5 Дек. 3, 2016 11:15:46

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль csv

JOHN_16
Уже разобрался, что дело в кодировке. Но спасибо за подсказку. (Да, с английским у меня проблема, не спорю)

Офлайн

#6 Дек. 3, 2016 17:39:36

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль csv

Подскажите, из файла csv можно получить данные отдельных столбцов? Если можно, то как?

Офлайн

#7 Дек. 3, 2016 18:08:05

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

Модуль csv

в цикле считываете строку, берете значение из нужного столбца, записываете в отдельный список - по окончании цикла работаете с этим списком



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

Офлайн

#8 Дек. 4, 2016 02:22:34

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

Модуль 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)

Офлайн

#9 Дек. 4, 2016 14:56:24

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль csv

py.user.next
JOHN_16
Спасибо, работает. Я думал, что цикл for перебирает по отдельным элементам (словам) только список или кортеж , но не строку. Насколько я понял, модуль csv возвращает строки. Думал, что строку цикл перебирает только по символам.

Офлайн

#10 Дек. 4, 2016 15:22:04

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

Модуль csv

Franek
Я думал, что цикл for перебирает по отдельным элементам (словам) только список или кортеж , но не строку.
И строку for перебирает тоже. Цикл for использует функцию iter() для перебора. А функция iter() вызывает метод __iter__() у объекта.

  
>>> '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 возвращает строки.
Модуль ничего не возвращает, он предоставляет функции и классы для работы с форматом csv (вообще, с форматом dsv). А вот функция csv.reader() возвращает объект, у которого есть метод __iter__() . И этот метод __iter__() возвращает итератор по разделённым строкам.

  
>>> 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']
>>>
Тут видно, что reader.__iter__() возвращает сам себя, потому что сам является итератором - то есть содержит метод __next__(), который потом и вызывается на каждом шаге. (Функция next() вызывает метод __next__() у объекта.)

А вот метод __next__() уже и возвращает очередной элемент.
  
>>> it.__next__()
['daemon', 'x', '2', '2', 'daemon', '/sbin', '/sbin/nologin']
>>>



Отредактировано py.user.next (Дек. 4, 2016 15:40:17)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version