在Python中读取CSV文件中特定行的方法

7
在使用Python读取CSV文件时,我们可以逐行或逐行读取整个文件。但是如果只想读取特定行(例如第24行),而不想读取整个文件和所有行,该怎么办呢?

2个回答

10

您可以使用 linecache.getline 方法:

linecache.getline(filename, lineno[, module_globals])

从名为 filename 的文件中获取第 lineno 行。该函数不会引发异常 - 在错误情况下它将返回空字符串(对于找到的行,终止换行符将包括在内)。

import linecache


line = linecache.getline("foo.csv",24)

或者使用itertools模块中的consume recipe移动指针:

import collections
from itertools import islice

def consume(iterator, n):
    "Advance the iterator n-steps ahead. If n is none, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        # feed the entire iterator into a zero-length deque
        collections.deque(iterator, maxlen=0)
    else:
        # advance to the empty slice starting at position n
        next(islice(iterator, n, n), None)

with open("foo.csv") as f:
    consume(f,23)
    line = next(f)

@xtofl,文件对象是它自己的迭代器,当你使用for line in f:...时,next会被重复调用。 - Padraic Cunningham
1
如何从特定行开始读取而不是从开头开始?只需使用consume(f,X)并每次递增X(在所需位置初始化X),感谢您有用的答案 :) - user3967257
@user3967257,如果您想从特定行开始,请使用consume recipe,consume的第二个参数是要消耗的行数,然后只需使用for line in f...来读取其余的行。 - Padraic Cunningham
这是我的意思: 对于i在X到limit的范围内: 使用(f,i)进行消费。 - user3967257

0

或者你可以在pandas中利用nrowsskiprows参数

line_number = 30
pd.read_csv('big.csv.gz', sep = "\t", nrows = 1, skiprows = line_number - 1)

记住 skiprows 可以是一个列表,所以如果你需要标题,请使用

pd.read_csv('big.csv.gz', sep = "\t", nrows = 1, skiprows = list(range(1, line_number - 1)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接