đây là cách tôi sẽ tiếp cận vấn đề, sử dụng càng nhiều sự lười biếng càng tốt:
from random import randint
from itertools import takewhile, islice
file = "/etc/passwd"
f = open(file, "r")
f.seek(randint(10,250))
pos = f.tell()
print "pos=%d" % pos
def countbytes(iterable):
bytes = 0
for item in iterable:
bytes += len(item)
yield bytes
print 1+len(list(takewhile(lambda x: x <= pos, countbytes(open(file, "r")))))
Đối với một cách tiếp cận hơi ít có thể đọc nhưng nhiều hơn nữa lười biếng, sử dụng enumerate
và dropwhile
:
from random import randint
from itertools import islice, dropwhile
file = "/etc/passwd"
f = open(file, "r")
f.seek(randint(10,250))
pos = f.tell()
print "pos=%d" % pos
def countbytes(iterable):
bytes = 0
for item in iterable:
bytes += len(item)
yield bytes
print list(
islice(
dropwhile(lambda x: x[1] <= pos, enumerate(countbytes(open(file, "r"))))
, 1))[0][0]+1
Nguồn
2009-11-27 15:22:08
Tôi thực sự đăng lớp học ở đâu đó ở đây trên SO ... không biết ở đâu. –
Nếu bạn đang tìm cách bù đắp byte, không có cách nào để biết dòng # mà không đếm số lượng \ n ký tự gặp phải trước vị trí đó. Như những gì cách hiệu quả nhất là với một tập tin, tôi không chắc chắn .... Chúc may mắn! – gahooa
yep. có thể có một số thư viện thực hiện dịch vụ này. Tôi đã tự mình thực hiện nó như tôi đã nói, nhưng tôi muốn ủy quyền tác vụ này cho một thư viện bên ngoài nếu có thể. –