2013-06-28 38 views
6

Tôi cần lấy giá trị của dòng trước đó trong một tệp và so sánh nó với dòng hiện tại khi tôi đang lặp qua tệp. Tệp này là HUGE vì vậy tôi không thể đọc toàn bộ hoặc truy cập ngẫu nhiên số dòng với linecache vì chức năng thư viện vẫn đọc toàn bộ tệp vào bộ nhớ.Đọc dòng trước trong một tệp python

EDIT Tôi rất tiếc, tôi quên đề cập đến rằng tôi phải đọc tệp ngược.

EDIT2

Tôi đã thử những điều sau đây:

f = open("filename", "r") 
for line in reversed(f.readlines()): # this doesn't work because there are too many lines to read into memory 

line = linecache.getline("filename", num_line) # this also doesn't work due to the same problem above. 
+1

Bạn có nghĩa là chỉ là dòng ngay trước đó? Bạn không thể chỉ cần lưu nó khi bạn đi? –

+2

Bạn sẽ có nhiều khả năng nhận trợ giúp hơn, nếu bạn cho chúng tôi thấy những gì bạn đã viết cho đến thời điểm này. – That1Guy

+0

Bạn có thể cung cấp những gì bạn đã thử không? Lặp lại trên một dòng tập tin bằng dòng là có thể, và gán dòng cho một biến là có thể, vì vậy những gì chính xác là đi sai? Bằng cách này, lớn như thế nào là HUGE? – ChrisP

Trả lời

12

Chỉ cần lưu trước khi bạn lặp tiếp theo

prevLine = "" 
for line in file: 
    # do some work here 
    prevLine = line 

này sẽ lưu trữ các dòng trước đó trong prevLine trong khi bạn đang looping

chỉnh sửa dường như OP cần đọc tập tin này ngược:

aaand sau một giờ nghiên cứu, tôi đã thất bại nhiều lần để thực hiện nó trong giới hạn bộ nhớ

Here bạn đi Lim, anh chàng đó biết anh đang làm gì, ở đây là ý tưởng tốt nhất của mình:

General approach #2: Read the entire file, store position of lines

With this approach, you also read through the entire file once, but instead of storing the entire file (all the text) in memory, you only store the binary positions inside the file where each line started. You can store these positions in a similar data structure as the one storing the lines in the first approach.

Whever you want to read line X, you have to re-read the line from the file, starting at the position you stored for the start of that line.

Pros: Almost as easy to implement as the first approach Cons: can take a while to read large files

+0

Cảm ơn rất nhiều. Nhưng tôi quên đề cập đến rằng tôi phải đọc các tập tin backwardly. –

+0

@LimH. Tôi đã thêm mã vào vòng lặp ngược cho bạn: D – Stephan

+0

Magic. Tôi mới làm quen với python, vì vậy mặc dù tôi biết tệp có thể lặp lại, nhưng việc sử dụng [:: - 1] không bao giờ vượt qua được suy nghĩ của tôi. Cảm ơn bạn. –

2

Tôi muốn viết một máy phát điện đơn giản cho các nhiệm vụ:

def pairwise(fname): 
    with open(fname) as fin: 
     prev = next(fin) 
     for line in fin: 
      yield prev,line 
      prev = line 

Hoặc, bạn có thể sử dụng công thức pairwise từ itertools:

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = itertools.tee(iterable) 
    next(b, None) 
    return itertools.izip(a, b) 
4

@Lim, dưới đây là cách tôi sẽ viết nó (trả lời các ý kiến)

def do_stuff_with_two_lines(previous_line, current_line): 
    print "--------------" 
    print previous_line 
    print current_line 

my_file = open('my_file.txt', 'r') 

if my_file: 
    current_line = my_file.readline() 

for line in my_file: 

    previous_line = current_line 
    current_line = line 

    do_stuff_with_two_lines(previous_line, current_line) 
+0

Cảm ơn bạn. Tôi vô cùng xin lỗi nhưng tôi quên đề cập đến rằng tôi phải đọc các tập tin lạc hậu. –

Các vấn đề liên quan