python - 如何在不包含列/行标题的制表符分隔文件中使用 itertools.islice()

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

我有一个 .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() 来分隔行,或者这在这里不起作用?

预先感谢您的帮助。

最佳答案

您似乎想要分割一个文件。

选项 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 = 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

另请参阅 tutorial使用 pandas 进行选择。

关于python - 如何在不包含列/行标题的制表符分隔文件中使用 itertools.islice(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52725404/

相关文章:

java - 如何按长度循环以下程序

javascript - 可以用 for 循环和 InnerHTML 显示数组吗?

python - 从类定义中的列表理解访问类变量

python直接将字符串写入tarfile

python-3.x - 如何使用 .p12 证书对 rest api 进行身份验证

python .format() 重复字段?

python - 从 C++ 读取 npy 文件

python - 即使在其中的命令退出后继续 for 循环

python - 如何使用 beautifulsoup 在另一个 div 元素中划分元素?

for-loop - 我如何在 Golang 中跳出无限循环