Найти - Пользователи
Полная версия: Почему len() збивает индекс?
Начало » Python для новичков » Почему len() збивает индекс?
1 2
nixis
Lexander
Всегда готов!
>>> f = open("mysql.opt") # Присваивает значение переменной открытый файл.
>>> f.tell() # С методом _.tell не сталкивался, но думаю что он считывает количество символов с строки(тот же len(), но как метод)
0 # Ничего не считало, потому что чтобы что-то считать нужно не только открыть файл, но и прочитать его, пример - str = f.read()
>>> s = f.read() # Чтение файла и присвоение в переменную s
>>> s # Должно вывести на консоль, то что считалось с файла
"#  Options file generated by MySQL client\n\n..." # rest of file here
>>> f.tell() 
316 # Вывело количество символов, потому что компьютер уже считал с файла командой f.read()
>>> s2 = f.read() # Присвоение переменной s2 то что вычитает из файла. Тут я мешкаюсь. Не знаю почему нельзя второй переменной, на прямую, через команду s2 = f.read(), присвоить считывание. Может f.read() должен быть, грубо привязан только к одной переменной.
>>> s2 
''
>>> s[5] # Вывести пятый символ в списке.
't'
>>> s2[5] # Ошибка. Думаю возможно еще что чтение закончилось и остановилось в конце файла, при инициализации первой переменной (s), и после этого нечего уже записывать. Вот и s2 пустая.  
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
Если где не прав, поправте пожалуйста. Буду очень признателен))

JOHN_16
nixis
эх…ну не знаете вы что такое tell - ну какой блин смысл гадать, когда рядом есть справка? tell() у файлового объекта возвращает позицию “курсора” в файле. Что бы более понятно было рассмотрите вариант того что вы открыли текстовой файл в текстовом редакторе, там есть курсор который вы можете поставить в произвольное положение, так вот tell() возвращает количество символов (а точнее байт) считая от начала файла.

Раз вы вызвали read() значит вы считали содержимое всего файла (считать содержимое файла до символа конца файла), и соответственно “курсор” будет находиться в конце файла. При еще одной попытке read() будет попытка считать файл, курсор которого уже находится в конце, а раз считывать нечего, то будет возвращена пустая строка.
nixis
JOHN_16
Извиняюсь за мое невежество)
Т.е. tell() сначало передвигает курсор в начало файла, а уж затем считывает. А len() считывает с положения на котором в данный момент находиться курсор?

P.s. В справочники и документацию не лезу. Когда-то рылся, но ничего не понял. Наверно не вырос до них(
Lexander
nixis
Извиняюсь за мое невежество
Это поправимо. Совместными усилиями мыс делаем из вас настоящего программиста и это не зависит от языка
Вы, кстати, какую версию питона используете?

tell() - говорит в каком месте файла вы (точнее, указатель-закладка внутри файла) сейчас находитесь.
read() - не просто читает файл и возвращает прочитанную строку.
Его поведение зависит от наличия и значения параметра - это раз.
Если параметр не указан (как в вашем случае), то read прочитает весь файл и вернет его содержимое в указанную переменную.
Второе, что делает read - перемещает указатель внутри файла на количество прочитанных символов.
Поэтому, если вы прочитали весь файл, то…?
Второй наводящий вопрос: где находится указатель файла при повторном вызове метода read() ?

Вы документацию то почитайте.
https://docs.python.org/3/library/io.html
Это будет эффективнее, чем гадать что значит тот или другой метод или функция.
И теперь с новыми знаниями попробуйте снова описать код.

Аналогия.
У вас есть мерный кувшин с указателями объема (рисками), заполненный водой.
Вы наливаете воду из кувшина в стакан.
Выпиваете воду из стакана и утоляете жажду.
Риски указывают текущий (оставшийся) объем воды в кувшине.

Если воду налить во второй кувшин большего объема, то в первом кувшине воды не останется.
Вы снова наливаете из первого кувшина в стакан.
Пытаетесь выпить воду из стакана, но ее нет - index out of range
nixis
Lexander
Это поправимо. Совместными усилиями мыс делаем из вас настоящего программиста и это не зависит от языка
Искренне на это надеюсь)
Вы, кстати, какую версию питона используете?
3.3.2, О.С. Ubuntu
Поэтому, если вы прочитали весь файл, то…?
Указатель находиться перед последним прочитаным символом, т.е. в конце файла?
Второй наводящий вопрос: где находится указатель файла при повторном вызове метода read() ?
Там же где и был - в конце?
Вы документацию то почитайте.
https://docs.python.org/3/library/io.html
Это будет эффективнее, чем гадать что значит тот или другой метод или функция.
И теперь с новыми знаниями попробуйте снова описать код.
Попробую, но она на английском. Прийдеться с гугл переводчиком сидеть…
Спасибо вам, за доступное для моего зеленого ума в питоне, знание

Lexander
nixis
Указатель находиться перед последним прочитаным символом, т.е. в конце файла?
Да, в конце файла.
Но не перед последним прочитанным символом, а после него.
Когда вы поднялись по ступенкам на следующий этаж, вы ведь не на предпоследней ступеньке находитесь, не так ли?
nixis
Там же где и был - в конце?
Точно.
nixis
Попробую, но она на английском. Придется с гугл переводчиком сидеть
Тут уж придется постараться. Без базового английского в программировании никак.

Прочтите страницу по ссылке и возвращайтесь с новыми комментариями к коду.
Я подожду.
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