如何在不包含列/行标题的制表符分隔文件中使用 itertools.islice()
Posted
技术标签:
【中文标题】如何在不包含列/行标题的制表符分隔文件中使用 itertools.islice()【英文标题】:How to use itertools.isslice() in a tab delim file that does not contain column/row headers 【发布时间】: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() 来分隔行,还是在这里不起作用?
提前感谢您的帮助。
【问题讨论】:
【参考方案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
的选择。
【讨论】:
以上是关于如何在不包含列/行标题的制表符分隔文件中使用 itertools.islice()的主要内容,如果未能解决你的问题,请参考以下文章