访问csv文件第N行的最佳方式

新手上路,请多包涵

我必须访问 CSV 文件中的第 N 行。

这是我所做的:

 import csv

the_file = open('path', 'r')
reader = csv.reader(the_file)

N = input('What line do you need? > ')
i = 0

for row in reader:
    if i == N:
        print("This is the line.")
        print(row)
        break

    i += 1

the_file.close()

…但这并不是最佳选择。精确编辑:如果文件很大,我不想遍历所有行,也不想将整个文件加载到内存中。

我确实希望存在类似 reader[N] 的东西,但我还没有找到它。

编辑答案:这一行(来自选择的答案)是我要找的:

 next(itertools.islice(csv.reader(f), N, None)

原文由 Gabriel L‘Heureux 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 350
2 个回答

您可以使用 enumerate 遍历列表,直到找到正确的行:

 for i, row in enumerate(reader):
    if i == line_number:
        print("This is the line.")
        print(row)
        break

您还可以使用专为此类场景设计的 itertools.islice 访问可迭代对象的特定片段而不将整个内容读入内存。它应该比遍历不需要的行更有效。

 def get_csv_line(path, line_number):
    with open(path) as f:
        return next(itertools.islice(csv.reader(f), line_number, None))

但是,如果您的 CSV 文件很小,只需将整个内容读入一个列表,然后您就可以通过索引以正常方式访问它。这还有一个好处,您可以按随机顺序访问多个不同的行,而无需重置 csv 阅读器。

 with open(path) as f:
    my_csv_data = list(csv.reader(f))
print(my_csv_data[line_number])

原文由 Stuart 发布,翻译遵循 CC BY-SA 4.0 许可协议

itertools 模块有许多用于创建专用迭代器的函数 - 其 islice() 函数可用于轻松解决此问题:

 import csv
import itertools

N = 5  # desired line number

with open('path.csv', newline='') as the_file:
    row = next(csv.reader(itertools.islice(the_file, N, N+1)))

print("This is the line.")
print(row)

PS 出于好奇,我最初的反应——也有效(可以说更好)——是:

     row = next(itertools.islice(csv.reader(the_file), N, N+1))

原文由 martineau 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题