Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python仅读取csv文件中的某些行_Python_Csv - Fatal编程技术网

使用python仅读取csv文件中的某些行

使用python仅读取csv文件中的某些行,python,csv,Python,Csv,我只想从csv文件中的某一行开始读取一定数量的行,而不需要迭代整个csv文件来达到这个特定点 假设我有一个包含100行的csv文件,我只想读取第50到60行。我不想从第1行到第49行迭代到第50行开始阅读。我能用seek实现这一点吗 例如: 寻求第50排 从50读到60 下次: 寻求第27排 读27至34 等等 因此,不仅要在文件中继续向前搜索,还要向后搜索 非常感谢您可以使用chunksize 作为pd进口熊猫 chunksize=10**6 对于pd.read\u csvfilename中的

我只想从csv文件中的某一行开始读取一定数量的行,而不需要迭代整个csv文件来达到这个特定点

假设我有一个包含100行的csv文件,我只想读取第50到60行。我不想从第1行到第49行迭代到第50行开始阅读。我能用seek实现这一点吗

例如: 寻求第50排 从50读到60

下次: 寻求第27排 读27至34 等等

因此,不仅要在文件中继续向前搜索,还要向后搜索

非常感谢

您可以使用chunksize

作为pd进口熊猫 chunksize=10**6 对于pd.read\u csvfilename中的chunk,chunksize=chunksize: 进程块 您可以使用chunksize

作为pd进口熊猫 chunksize=10**6 对于pd.read\u csvfilename中的chunk,chunksize=chunksize: 进程块
一种选择是使用熊猫。例如:

import pandas as pd
# Select file 
infile = r'path/file'
# Use skiprows to choose starting point and nrows to choose number of rows
data = pd.read_csv(infile, skiprows = 50, nrows=10)

一种选择是使用熊猫。例如:

import pandas as pd
# Select file 
infile = r'path/file'
# Use skiprows to choose starting point and nrows to choose number of rows
data = pd.read_csv(infile, skiprows = 50, nrows=10)

正如其他人所说,最明显的解决方案是使用csv! 该方法有一个名为skiprows的参数:

有人说:

skiprows:类似列表、int或可调用、可选 在文件开头跳过0索引的行号或跳过int的行数

如果可调用,将根据行索引计算可调用函数,如果应跳过该行,则返回True,否则返回False。一个有效的可调用参数示例是[0,2]中的lambda x:x

你可以有这样的东西:

import pandas as pd
data = pd.read_csv('path/to/your/file', skiprows =lambda x: x not in range(50, 60))
因为您指定内存是您的问题,所以可以使用chunksize参数,如中所述

他说,

该参数本质上是指要读入数据的行数 数据帧在任何单一时间,以适应本地内存。 因为数据包含超过7000万行,所以我指定 chunksize为每次100万行,这会破坏大数据 分成许多小块

您可以尝试这样做,并在块上迭代以仅检索您正在查找的行


如果行号在指定列表中,则函数应返回true,因为其他人说最明显的解决方案是使用csv! 该方法有一个名为skiprows的参数:

有人说:

skiprows:类似列表、int或可调用、可选 在文件开头跳过0索引的行号或跳过int的行数

如果可调用,将根据行索引计算可调用函数,如果应跳过该行,则返回True,否则返回False。一个有效的可调用参数示例是[0,2]中的lambda x:x

你可以有这样的东西:

import pandas as pd
data = pd.read_csv('path/to/your/file', skiprows =lambda x: x not in range(50, 60))
因为您指定内存是您的问题,所以可以使用chunksize参数,如中所述

他说,

该参数本质上是指要读入数据的行数 数据帧在任何单一时间,以适应本地内存。 因为数据包含超过7000万行,所以我指定 chunksize为每次100万行,这会破坏大数据 分成许多小块

您可以尝试这样做,并在块上迭代以仅检索您正在查找的行


如果行号在指定列表中,则函数应返回true

如果列/行的长度是可变的,则在不读取ie、处理在此之前的文件的每个字符并计算行终止符的情况下,无法找到所需的行。在python中处理它们的最快方法是使用迭代

至于用大文件进行迭代的最快方法,我不知道这样逐行迭代是否更快:

with open(file_name) as f:
    for line,_ in zip(f, range(50)):
        pass
    lines = [line for line,_ in zip(f, range(10))]
…或使用seek一次读取一个字符,并计算新行字符数。但第一步肯定要方便得多

但是,如果文件被大量读取,那么随着时间的推移,对这些行的迭代将变得缓慢。如果文件内容没有改变,您可以通过读取整个内容一次并提前建立一个行长度的dict来实现这一点:

from itertools import accumulate
with open(file_name) as f:
    cum_lens = dict(enumerate(accumulate(len(line) for line in f), 1))
这将允许您查找文件中的任何行号,而无需再次处理整个内容:

def seek_line(path, line_num, cum_lens):
    with open(path) as f:
        f.seek(cum_lens[line_num], 0)
        return f.readline()

class LineX:
    """A file reading object that can quickly obtain any line number."""
    def __init__(self, path, cum_lens):
        self.cum_lens = cum_lens
        self.path = path
    def __getitem__(self, i):
        return seek_line(self.path, i, self.cum_lens)

linex = LineX(file_name, cum_lens)
line50 = linex[50]

但此时,最好将文件内容加载到某种数据库中。这取决于您尝试执行的操作,以及文件包含的数据类型。

如果列/行长度的长度是可变的,则如果不读取ie、处理文件前面的每个字符并计算行终止符,就无法找到所需的行。在python中处理它们的最快方法是使用迭代

至于用大文件进行迭代的最快方法,我不知道这样逐行迭代是否更快:

with open(file_name) as f:
    for line,_ in zip(f, range(50)):
        pass
    lines = [line for line,_ in zip(f, range(10))]
…或使用seek一次读取一个字符,并计算新行字符数。但这是肯定的 做第一件事要方便得多

但是,如果文件被大量读取,那么随着时间的推移,对这些行的迭代将变得缓慢。如果文件内容没有改变,您可以通过读取整个内容一次并提前建立一个行长度的dict来实现这一点:

from itertools import accumulate
with open(file_name) as f:
    cum_lens = dict(enumerate(accumulate(len(line) for line in f), 1))
这将允许您查找文件中的任何行号,而无需再次处理整个内容:

def seek_line(path, line_num, cum_lens):
    with open(path) as f:
        f.seek(cum_lens[line_num], 0)
        return f.readline()

class LineX:
    """A file reading object that can quickly obtain any line number."""
    def __init__(self, path, cum_lens):
        self.cum_lens = cum_lens
        self.path = path
    def __getitem__(self, i):
        return seek_line(self.path, i, self.cum_lens)

linex = LineX(file_name, cum_lens)
line50 = linex[50]
但此时,最好将文件内容加载到某种数据库中。这取决于您尝试执行的操作以及文件包含的数据类型。

很简单:

with open("file.csv", "r") as file:
    print(file.readlines()[50:60])
这很容易:

with open("file.csv", "r") as file:
    print(file.readlines()[50:60])


你能使用外部库吗?因为它是csv,所以我假设它是字符。每行的字符数是否始终相同?是否始终使用相同的行分隔符?可能重复的要跳过整个文件并读取特定行,行的长度必须固定。否则如何知道你在哪一行,而不计算文件中的每一个换行直到你想要的行,这意味着从一开始就读取整个文件。CSV是20gb文件的错误格式。将它转换为数据库。也许我遗漏了一些东西,但是如果不读取文件之前的部分,就不可能找到您想要的行吗?编辑:除非如上面的评论所说,否则这些行的长度是提前知道的。这里不是这样。你能使用外部库吗?因为它是csv,我假设它是字符。每行的字符数是否始终相同?是否始终使用相同的行分隔符?可能重复的要跳过整个文件并读取特定行,行的长度必须固定。否则如何知道你在哪一行,而不计算文件中的每一个换行直到你想要的行,这意味着从一开始就读取整个文件。CSV是20gb文件的错误格式。将它转换为数据库。也许我遗漏了一些东西,但是如果不读取文件之前的部分,就不可能找到您想要的行吗?编辑:除非如上面的评论所说,否则这些行的长度是提前知道的。这里的情况不是这样的,那么你还是要读整个文件。对于100行不是问题,但是当您读取多达10000行的多列文件时…通常文件的大小不是问题。这取决于你的计算机内存。当你编写代码时,你的错误是什么?文件的大小为我指定的范围创建一个数据帧。当我想从不在此数据帧中的另一个范围读取数据时,我必须创建一个新的数据帧。这不是最优的。此外,熊猫只允许向前阅读,而不是向后阅读。就像我读的第一行,例如第70到80行,然后下一次读第30到40行。这在熊猫身上是不可能的。因为文件是20gb,当你仍然读取整个文件时,程序就会崩溃。对于100行不是问题,但是当您读取多达10000行的多列文件时…通常文件的大小不是问题。这取决于你的计算机内存。当你编写代码时,你的错误是什么?文件的大小为我指定的范围创建一个数据帧。当我想从不在此数据帧中的另一个范围读取数据时,我必须创建一个新的数据帧。这不是最优的。此外,熊猫只允许向前阅读,而不是向后阅读。就像我读的第一行,例如第70到80行,然后下一次读第30到40行。这在熊猫身上是不可能的。因为文件是20gb,所以程序只是Crassesi尝试了一下。使用skiprows,pandas以某种方式也通过csv进行迭代。或者至少读取整个文件以创建一个带有索引的列表。这不是我想要的,因为文件是20gb。请检查我的答案@HorstPandas将以某种方式跟踪已跳过的行数。如果行的长度是恒定的,或者它们被编入索引,则可以绕过此问题。否则,唯一的方法就是计算需要读取文件的换行数。使用skiprows,pandas以某种方式也通过csv进行迭代。或者至少读取整个文件以创建一个带有索引的列表。这不是我想要的,因为文件是20gb。请检查我的答案@HorstPandas将以某种方式跟踪已跳过的行数。如果行的长度是恒定的,或者它们被编入索引,则可以绕过此问题。否则,唯一的方法就是计算需要读取文件的换行数。使用skiprows,pandas以某种方式也通过csv进行迭代。或者至少读取整个文件以创建一个带有索引的列表。这不是我想要的,因为文件是20gb。如果@Horst只需要第50-60行,那么你的函数不应该是lambda x:x不在50,60范围内吗?指定chunksize通常会起作用,但它不允许我来回,只允许向前获取下一个块。但在应用程序中,我必须绘制数据和
用户应该能够显示下一个区块以及上一个区块。基本上从开始到结束,从结束到开始。通过这样做,用户应该能够定义他希望立即看到的块大小。使用skiprows,pandas以某种方式也通过csv进行迭代。或者至少读取整个文件以创建一个带有索引的列表。这不是我想要的,因为文件是20gb。如果@Horst只需要第50-60行,那么你的函数不应该是lambda x:x不在50,60范围内吗?指定chunksize通常会起作用,但它不允许我来回,只允许向前获取下一个块。但在applycation中,我必须绘制数据,用户应该能够显示下一个区块,也可以显示上一个区块。基本上从开始到结束,从结束到开始。通过这样做,用户应该能够定义他希望立即看到的块大小。不,它不是,因为它首先读取整个文件,然后在读取整个文件后,返回第[50:60]行。这就是我不想要的20gb文件。不,它不是,因为它先读取整个文件,然后在读取整个文件后,返回第[50:60]行。这就是我不想要20gb文件的原因。