Итерации по сжатому текстовому файлу прекращаются после цикла for - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь перебрать текстовый файл g-zip.Формат таков, что данные находятся в блоках по четыре строки.Мне нужно взять процент этих блоков и скопировать их в другой файл.Мой код принимает каждый блок, а затем определяет, нужно ли его копировать с помощью random.random ().Моя проблема в том, что код останавливается после выбора первого блока и прекращает итерации по файлу g-zip.У кого-нибудь есть идеи, что я могу делать не так?

Спасибо!Крис

Ссылка на файл: Скачать

#Calc percentage of reads that should be sampled
per_reads = sub_reads_num/input_reads

#Read gzipped file and save selected lines to mem
output_list = []

input_f = gzip.open(input_path, 'rb')

counter = 0
buffer = []
for line in input_f:
    buffer.append(line)
    counter += 1
    if counter == 4:
        if random.random() < per_reads:
            for x in buffer:
                output_list.append(x)
        else:
            buffer = []
            counter = 0

input_f.close()

1 Ответ

0 голосов
/ 28 ноября 2018

После того, как вы соберете группу из четырех человек и решите сохранить ее или нет;сбросьте счетчик и буфер.

for line in input_f:
    buffer.append(line)
    counter += 1
    if counter == 4:
        if random.random() < per_reads:
            for x in buffer:
                output_list.append(x)
        buffer = []
        counter = 0

Рефакторирован для использования перечисления и list.extend

for line_no, line in enumerate(input_f, 1):
    buffer.append(line)
    if line_no % 4 == 0:
        if random.random() < per_reads:
            output_list.extend(buffer)
        buffer = []

Этот тест работает, ...

output_list = []
buffer = []
input_f = list('abcdefghejklmnopqrstuvwxyz')
for line_no, line in enumerate(input_f, 1):
    buffer.append(line)
    print(line_no)
    if line_no % 4 == 0:
##        if random.random() < per_reads:
        if random.choice((0,1,2,3)) < 2:
            print(buffer)
            output_list.extend(buffer)
        buffer = []

Результат:

>>>
1
2
3
4
5
6
7
8
9
10
11
12
['e', 'j', 'k', 'l']
13
14
15
16
17
18
19
20
['q', 'r', 's', 't']
21
22
23
24
25
26
>>> output_list
['e', 'j', 'k', 'l', 'q', 'r', 's', 't']
>>> 

Возможно, ваше условие не работает

...