Почему нет len (файла) в Python?

Я не совсем новый для Python, но мне все еще трудно понять, что делает что-то "Pythonic" (и наоборот).

Так что простите меня, если это глупый вопрос, но почему я не могу получить размер файла, сделав len (файл)?

файл. __len__ даже не реализован, поэтому ему не нравится что-то еще? Было бы непонятным или непоследовательным по какой-то причине, если бы оно было реализовано для возврата размера файла?

Ответ 1

файл - это итератор. Чтобы найти количество строк, необходимых для чтения всего файла

sum(1 for line in file)

если вы хотите количество байтов в файле, используйте os.stat

например

import os
os.stat(filename).st_size

Ответ 2

Файлы имеют более широкое определение, особенно в Unix, чем вы думаете. Какова длина принтера, например? Или диск CDROM? Оба являются файлами в /dev и похожими в Windows.

Для чего мы обычно считаем файлом, какова будет его длина? Размер переменной? Размер файла в байтах? Последнее имеет больше смысла, но затем становится более неприятным. Если необходимо указать размер содержимого файла или его размер на диске (размер блока распределения модулей). Вопрос снова возникает для разреженных файлов (файлы с большими пустыми разделами, которые не занимают места, но являются частью файла, обычно сообщаемого размером, поддерживаемого некоторыми файловыми системами, такими как NTFS и XFS).

Конечно, ответ на все это может быть "просто выберите один и запишите то, что вы выбрали". Возможно, это именно то, что нужно сделать, но быть Pythonic, что-то обычно должно быть четким, без необходимости читать много документов. len(string) в основном очевидна (можно спросить, являются ли байты или символы возвращаемым значением), len(array) очевидно, len(file) может быть не совсем достаточно.

Ответ 3

Так что простите меня, если это глупый вопрос, но почему я не могу получить размер файла, сделав len (файл)?

Ответ Чарльза Бернса дает хорошее представление о философии Unix "все является файлом", и, хотя вы всегда можете использовать os.fstat() чтобы получить "размер" для любого дескриптора файла, с чем-то вроде...

import os

f = open(anything)
size = os.fstat(f.fileno()).st_size

... он может не вернуть ничего значимого или полезного...

>>> os.fstat(sys.stdout.fileno()).st_size
0
>>> fd1, fd2 = os.pipe()
>>> os.fstat(fd1).st_size
0

Я думаю, причина в том, что объект файла Python или файл-подобный объект должен представлять поток, а потоки по своей сути не имеют длины, особенно если они только для записи, например sys.stdout.

Как правило, единственное, что вы можете гарантировать для файла, подобного файлу Python, - это поддержка хотя бы одного из read() или write(), и что об этом.

Ответ 4

Я бы сказал, потому что поиск длины зависит от конкретных функций ОС. Вы можете найти длину файла с этим кодом:

import os os.path.getsize('C:\\file.txt')

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

Ответ 5

file возвращает итератор, поэтому вы не можете использовать len() на нем.

Чтобы получить размер файла, вы можете использовать os.stat:

>>> foo = os.stat("abc")
>>> foo.st_size
193L

Если по размеру вы имеете в виду количество строк, попробуйте следующее:

len(open("abc").readlines())

или

sum (1 for _ in open("abc"))

Ответ 6

Простым способом измерения количества символов будет:

file = open('file.bin', 'r')
# Seek to the end. (0 bytes relative to the end)
file.seek(0, 2)
length = file.tell()