【问题标题】:Find the last row from a CSV input Python从 CSV 输入 Python 中查找最后一行
【发布时间】:2019-04-28 05:34:52
【问题描述】:

我并没有真正找到与我的问题相关的示例,因为我不了解 Pandas,所以我将其发布在这里。如果不清楚或已经回复,请告诉我。

我有一个 CSV 输入,我像这样导入它

def import_csv(csvfilename):
    data = []
    with open(csvfilename, "r", encoding="utf-8", errors="ignore") as scraped:
        reader = csv.reader(scraped, delimiter=',')
        row_index = 0
        for row in reader:
            if row:  # avoid blank lines
                row_index += 1
                columns = [str(row_index), row[0], row[1], row[2]]
                data.append(columns)

    return data

我用 input_rows 索引行(可能有更好的方法?)

输入示例:

[['1',
  '[FirstValue]',
  'FirstText',
  'AB'],

 [...]

 ['12',
  "['LastValue']",
  "LastText",
  'YZ']]

我正在寻找此输入列表的最后一行。有没有一种简单的方法可以在不遍历所有行的情况下做到这一点?

谢谢!

【问题讨论】:

标签: python


【解决方案1】:

Python 支持负索引。

your_list[-1] # Fetch the last value in your list.

如果不了解您的用例以及有关数据的更多信息以及您通常如何访问数据,很难说哪种数据结构更适合您。

【讨论】:

    【解决方案2】:

    您可以像这样获取数组中的最后一个元素:

    some_list[-1]

    事实上,你可以用这个语法做更多的事情。 some_list[-n] 语法获取倒数第 n 个元素。所以some_list[-1] 得到最后一个元素,some_list[-2] 得到倒数第二个,等等

    所以在你的情况下,它会是:

    import csv    
    
    def import_csv(csvfilename):
        data = []
        with open(csvfilename, "r", encoding="utf-8", errors="ignore") as scraped:
            reader = csv.reader(scraped, delimiter=',')
            for row in reader:
            if row:  # avoid blank lines
                row_index += 1
                columns = [str(row_index), row[0], row[1], row[2]]
                data.append(columns)
    return data
    
    data = import_csv(file_name)
    last_row = data[-1]
    

    【讨论】:

    • csv.reader 是一个迭代器,不能这样下标。
    • @Idlehands 你说得对,很好。我已经更正了答案。
    • 奇怪的是,即使在您编辑之后它也锁定了我的投票...如果您再次编辑答案,我很乐意收回我的反对票。
    • 非常感谢您的回答!我在做 reader[-1] 时犯了一个错误,但不行! :)
    • 这不是说你必须加载整个文件吗?对于大型 csv 文件,这可能不是一个好方法,因为该数据数组最终会保存整个 csv 文件。加载到数据列表中时,一个 30mb 的 csv 文件将使用 30mb 的内存。 csv 阅读器返回一个迭代器对象以进行内存优化。我猜像stackoverflow.com/a/2138894/3011082 这样的手动方法会保留迭代器的内存优势。
    【解决方案3】:

    值得注意的是,csv.reader 是一个 Iterator,在迭代之前不包含您的数据。 scraped 打开的 I/O Stream 对象也是如此,它也是一个迭代器。不幸的是,“我可以在不遍历文件/数据的情况下获得最后一行”的问题是否定的,除非您知道可以跳转到的特定流点(使用scraped.seek()),否则您将无法获得最后一行,直到所有数据都被迭代。

    但是,一旦您使用了所有数据,您可以通过负索引在您的代码中检索带有 data[-1] 的内容,即返回 list 的最后一行。

    Here is a related question that might be of interest to you,但同样,在允许 reverse() 操作之前,所有答案都会消耗数据(读取整个列表),因此,所有数据必须至少读取一次。

    【讨论】:

    • 感谢您的解释!不,没有具体点,所以我将使用 data[-1]
    • 根据我的最佳答案。
    【解决方案4】:

    您实际上可以在 with statment 中获取最后一行,因为 python 支持负索引,您可以使用

    with open(csvfilename, "r", encoding="utf-8", errors="ignore") as scraped:
            final_line = scraped.readlines()[-1]
            
    

    【讨论】:

    • 这个很有用,谢谢!获取文件最后一行的最简单方法。
    猜你喜欢
    • 2021-06-07
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多