【问题标题】:How to use itertools.isslice() in a tab delim file that does not contain column/row headers如何在不包含列/行标题的制表符分隔文件中使用 itertools.islice()
【发布时间】:2018-10-09 16:21:57
【问题描述】:

我有一个 .txt 文件,其中包含 1000 行 500 列,其中包含 0-2 范围内的整数。例如,前三行可能如下所示:

0 0 0 0 2 2 2 2 2 1 1 1 0 2 1 2 ...
0 2 2 2 0 0 0 0 1 0 0 0 1 0 2 0 ...
0 2 2 2 2 2 2 2 0 1 1 1 1 1 1 1 ...

我要将给定行中的每一列值与另一列值进行比较,并对它们进行处理。

但是,在我的迭代过程中,我需要区分前 500 行和后 500 行。

如果我编写如下代码:

for row in file:
    for col1 in row:
        for col2 in row:

for 循环将包括所有行。我的目标是有两个这样的 for 循环,一个用于前 500 行,另一个用于最后 500 行。行由新行分隔,它是我正在使用 csv.reader 读取的 .txt 文件。

搜索一些我发现 itertools.isslice() 可能适用于这个问题,但在我在文档中看到的所有示例中,要么只有一行,要么每一行中第一列的质量可以用于区分行本身。

我是否在正确的轨道上认为我可以使用 itertools.isslice() 来分隔行,还是在这里不起作用?

提前感谢您的帮助。

【问题讨论】:

    标签: python python-3.x for-loop itertools


    【解决方案1】:

    您似乎希望拆分文件。

    选项 1:是的,您可以使用 itertools.islice 完成此操作。行本身可以用csv 模块分隔。

    给定

    制表符分隔文件示例test.txt

    # test.txt
    a   0   0   0   0   2   2   2   2   2
    b   0   2   2   2   0   0   0   0   1
    c   0   2   2   2   0   0   0   0   1
    d   0   0   0   0   2   2   2   2   2
    e   0   2   2   2   0   0   0   0   1
    f   0   2   2   2   0   0   0   0   1
    g   0   0   0   0   2   2   2   2   2
    h   0   2   2   2   0   0   0   0   1
    i   0   2   2   2   0   0   0   0   1
    

    >>>  import csv
    >>>  import itertools as it
    
    
    >>> fpath = "./test.txt"
    

    代码

    我们实现了一个generator,它可以读取文件并干净地产生其行:

    >>> def read_file(filepath):
    ...     with open(filepath, "r") as f:
    ...         reader = csv.reader(f, delimiter="\t")
    ...         for row in reader:
    ...             yield row
    

    演示

    现在我们读取文件并切片一些行,例如5。剩余的lines 包含文件的其余部分:

    >>> lines = read_file(fpath)
    
    >>> top = list(it.islice(lines, 5))
    >>> bot = list(lines)
    
    >>> top
    [['a', '0', '0', '0', '0', '2', '2', '2', '2', '2'],
     ['b', '0', '2', '2', '2', '0', '0', '0', '0', '1'],
     ['c', '0', '2', '2', '2', '0', '0', '0', '0', '1'],
     ['d', '0', '0', '0', '0', '2', '2', '2', '2', '2'],
     ['e', '0', '2', '2', '2', '0', '0', '0', '0', '1']]
    
    >>> bot
    [['f', '0', '2', '2', '2', '0', '0', '0', '0', '1'],
     ['g', '0', '0', '0', '0', '2', '2', '2', '2', '2'],
     ['h', '0', '2', '2', '2', '0', '0', '0', '0', '1'],
     ['i', '0', '2', '2', '2', '0', '0', '0', '0', '1']]
    

    另请参阅csv 解析的更多信息。


    选项 2:或者,考虑 pandas,第三方库。

    演示

    >>> import pandas as pd
    
    
    >>> df = pd.read_csv(fpath, delimiter="\t", header=None)
    
    >>> top = df.iloc[:5, :]
    >>> bot = df.iloc[5:, :]
    
    >>> top    
       0  1  2  3  4  5  6  7  8  9
    0  a  0  0  0  0  2  2  2  2  2
    1  b  0  2  2  2  0  0  0  0  1
    2  c  0  2  2  2  0  0  0  0  1
    3  d  0  0  0  0  2  2  2  2  2
    4  e  0  2  2  2  0  0  0  0  1
    
    >>> bot
       0  1  2  3  4  5  6  7  8  9
    5  f  0  2  2  2  0  0  0  0  1
    6  g  0  0  0  0  2  2  2  2  2
    7  h  0  2  2  2  0  0  0  0  1
    8  i  0  2  2  2  0  0  0  0  1
    

    另请参阅此tutorialpandas 的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2012-03-29
      相关资源
      最近更新 更多