Найти - Пользователи
Полная версия: Модуль csv
Начало » Python для новичков » Модуль csv
1
Franek
Здравствуйте. Подскажите, как сделать чтение из файла 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?)
И ещё, скажите, по этому модулю документация есть?
Franek
 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>
JOHN_16
мда… Я прям вот не знаю что и сказать.. Вот прям смотрю и грустно.
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 но как я могу предположить у вас с английским проблемы планетарного масштаба.
JOHN_16
Franek
UnicodeDecodeError: ‘charmap’ codec can't decode byte 0x98 in position 53: character maps to <undefined>
ой надо же, какая редкая проблема…прям хоть Гвидо подключай (создателя языка)
Franek
open(“autobelarus.csv”, “r”, encoding=“utf-8”)
кодировку текста указать надо
Franek
JOHN_16
Уже разобрался, что дело в кодировке. Но спасибо за подсказку. (Да, с английским у меня проблема, не спорю)
Franek
Подскажите, из файла csv можно получить данные отдельных столбцов? Если можно, то как?
JOHN_16
в цикле считываете строку, берете значение из нужного столбца, записываете в отдельный список - по окончании цикла работаете с этим списком
py.user.next
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']
>>>
Franek
py.user.next
JOHN_16
Спасибо, работает. Я думал, что цикл for перебирает по отдельным элементам (словам) только список или кортеж , но не строку. Насколько я понял, модуль csv возвращает строки. Думал, что строку цикл перебирает только по символам.
py.user.next
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']
>>>
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