2015-02-23 8 views
1

Я изучаю питон, и эта вещь меня сбивает с толку. Не было бы лучше, если бы итератор и файловый объект были разными, поэтому мы можем поддерживать несколько итераций в файлах. Итак, почему файловые объекты python имеют собственные итераторы?Почему объекты файлов имеют собственные итераторы в python?

+0

Что именно вы подразумеваете под «множественной итерацией в файлах»? – vaultah

+1

@ 61612: 'iter (fileobj)' затем перебираем это и он будет независим от другого 'iter (fileobj)'. –

+0

Это то, что позволяет 'file.seek'. –

ответ

3

Поскольку ваша ОС не позволяет вам это делать, а также потому, что файлы на диске - это не поддержка файлов файлов Python only type of I/O10. Файлы являются потоками данных и обрабатываются так же, как и другие источники потока, такие как розетки и трубки.

Потоки ведут себя точно так же, как итераторы, за исключением того, что файл на диске также может поддерживать поиск. Сетевые сокеты и трубки, с другой стороны, не поддерживают поиск, но для ОС и Python это также потоки или файлы.

Эта абстракция позволяет применять множество оптимизаций для обработки файлов (и потоков) и фактически является де-факто способом поиска файлов в течение десятилетий.

Python может обрабатывать объекты файла диска по-разному и открывать несколько дескрипторов файловой системы ОС для данного файлового объекта Python. Но это было бы довольно неэффективно; узким местом является связь с диском, и хотя ваша ОС может накапливать данные по мере того, как они поступают с жесткого диска, вы должны, как правило, избегать, читающих один и тот же файл более одного раза.

Кроме того, есть проблемы с , написание на диск. ОС уже требует указать режим файла; чтения или записи. Вы можете открыть дескриптор файла, который может сделать то и другое, но тогда ОС, возможно, придется обрабатывать кеширование по-другому, так как нужно учитывать, что ваш файл может быть изменен, когда вы снова читаете одни и те же биты. Python должен был бы реплицировать все это, если бы разрешалось использование нескольких итераторов, в которых вы также пишете поток.

+0

вы могли бы уменьшить это до «Потому что кто-то сказал так давно». (+1 все равно: P) –

+0

Я действительно не понял, почему can not file object и file iterator - две разные вещи, чтобы мы могли вызвать iter (файл-объект) для создания нескольких итераторов файлов, как и списки? –

+1

@ShikharSrivastava: потому что не все объекты файлов поддерживают поиск или несколько итераторов, а потому, что поддержка этого варианта использования будет способствовать неэффективной обработке файлов. Прочитайте один раз при обработке, избегайте повторного чтения. –

Смежные вопросы