Как использовать itertools.isslice () в файле с разделителями табуляции, который не содержит заголовков столбцов / строк - PullRequest
0 голосов
/ 09 октября 2018

У меня есть файл .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 будет включать все строки.Моя цель состоит в том, чтобы иметь два таких цикла: один для первых 500 строк и другой для последних 500 строк.Строки разделены новыми строками, и это текстовый файл, который я читаю при использовании csv.reader.

Обыскивая некоторые, я вижу, что itertools.isslice () может работать для этой проблемы, но во всех примерах, которые я видел в документации, либо есть одна строка, либо в каждом из них есть качества первого столбцастрока, которая может использоваться для различения самих строк.

Я на правильном пути, думая, что могу использовать itertools.isslice () для разделения строк или это не сработает?

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 10 октября 2018

Кажется, вы хотите разделить файл.

Вариант 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"

Код

Мы реализуем генератор , который может читать файл и безошибочно выводить его строки:

>>> 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

См. Также учебник на выбор с pandas.

...