AttributeError when trying to use seek() to get last row of csv file

前端 未结 2 705
孤独总比滥情好
孤独总比滥情好 2020-12-19 15:57

I am trying to return the last row from a csv file. I am modifying another function that I wrote previously that returns the last line from a text file. It seemed to work

相关标签:
2条回答
  • 2020-12-19 16:35

    csv reader not support seek, so you can get csv file last line as text file, then process last line as csv. In your code, if last line length > distance, then will get only part of last line.

    import os
    
    def get_last_line(fin):
        line_len = 80
        fin.seek(0, os.SEEK_END)
        file_size = fin.tell()
        while True:
            line_len = min(line_len * 2, file_size)
            fin.seek(-line_len, os.SEEK_END)
            lines = f.readlines()
            if len(lines) > 1 or line_len == file_size:
                return lines[-1]
    

    then read csv:

    import csv
    
    print ', '.join(csv.reader([last_line]).next())
    
    0 讨论(0)
  • 2020-12-19 16:46

    Here's a slight variation of the core concept in the accepted answer to the question Have csv.reader tell when it is on the last line applied to your variation of the problem. Since each row is potentially a different length, there's really no way around having to read the whole file.

    import csv
    
    def get_last_row(csv_filename):
        with open(csv_filename, 'r') as f:
            lastrow = None
            for lastrow in csv.reader(f): pass
            return lastrow
    

    Update

    Here's a simpler and likely faster way to do it using a collections.deque. I got the idea from one of the answers to the question How to read an output line containing a list of integers produced.

    from collections import deque
    import csv
    
    def get_last_row(csv_filename):
        with open(csv_filename, 'r') as f:
            try:
                lastrow = deque(csv.reader(f), 1)[0]
            except IndexError:  # empty file
                lastrow = None
            return lastrow
    
    0 讨论(0)
提交回复
热议问题