【问题标题】:Python csv.reader: How do I return to the top of the file?Python csv.reader:如何返回文件顶部?
【发布时间】:2010-09-30 17:05:43
【问题描述】:

当我使用 csv.reader 浏览文件时,如何返回文件顶部。如果我使用普通文件执行此操作,我可以执行“file.seek(0)”之类的操作。 csv 模块有类似的东西吗?

提前谢谢;)

【问题讨论】:

    标签: python csv


    【解决方案1】:

    您仍然可以使用 file.seek(0)。例如,请看以下内容:

    import csv
    file_handle = open("somefile.csv", "r")
    reader = csv.reader(file_handle)
    # Do stuff with reader
    file_handle.seek(0)
    # Do more stuff with reader as it is back at the beginning now
    

    这应该可以工作,因为 csv.reader 正在使用它。

    【讨论】:

    • 虽然 file_handle.seek(0) 确实有效,但 reader.line_num 计数不会重置,因此如果您想稍后使用它,那么您将遇到问题。您当然可以在 seek(0) 之后重复“reader = csv.reader(file_handle)”,但是如果您将它放在外部“for row in reader:”循环中,则此操作将无法正常工作为“reader.line_num” ' 不增加。如果您将 for 循环替换为 while,则可以解决该问题,但不太确定您在上次读取时如何整理文件结尾的情况。
    【解决方案2】:

    您可以直接查找文件。例如:

    >>> f = open("csv.txt")
    >>> c = csv.reader(f)
    >>> for row in c: print row
    ['1', '2', '3']
    ['4', '5', '6']
    >>> f.seek(0)
    >>> for row in c: print row   # again
    ['1', '2', '3']
    ['4', '5', '6']
    

    【讨论】:

    • 这确实会重新开始,但如果文件有标题行,它将返回列名作为第一行的“值”。所以如果你使用 DictReader,你会得到这样的一行:"{'name': 'name', 'dob': 'dob', 'email': 'email}"
    • 如果您只有对阅读器的引用而不是文件句柄,有什么方法可以做到这一点?我正在编写一个函数,它将读取器作为输入,扫描所有行并(理想情况下)然后在解析后将文件位置重置为 seek(0)。理想情况下,我们不必将文件参数也传递给这个函数,函数签名很简单:csv_aggregate(reader, agg_functions, reset_after_calc=True) 我们可以使用reader._file.seek(0) 或类似的东西吗?
    • @Federico A. Ramponi 如果不使用文件,如何寻求顶部。例如csv_reader = csv.reader(stdout.decode('ascii').split('\n'), delimiter=' ')
    【解决方案3】:

    我发现csv.readercsv.DictReader 有点难以使用,因为当前的line_nummaking a list 从第一次读取效果很好:

    >>> import csv
    >>> f = open('csv.txt')
    >>> lines = list( csv.reader(f) ) # <-- list from csvReader
    >>>
    >>> for line in lines:
    ...  print(line)
    ['1', '2', '3']
    ['4', '5', '6']
    >>>
    >>> for line in lines:
    ...  print(line)
    ['1', '2', '3']
    ['4', '5', '6']
    >>>
    >>>lines[1]
    ['4', '5', '6']
    

    这会捕获dictReader 使用的optional first row,但可以让您一次又一次地使用列表,甚至检查单个行。

    【讨论】:

    • 它会工作,但它不是真正的内存效率
    猜你喜欢
    • 2018-10-19
    • 2016-11-18
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多