Как взять несколько строк числовых данных из текстового документа в Python, выполнить операцию с ними и записать их в текстовый документ? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть 2 набора числовых данных в строках и столбцах, сохраненных в 2 текстовых документах. Я хочу взять первые 20 строк из каждого документа, объединить их и поместить в третий документ. Также я хочу, чтобы это повторялось для каждых 20 строк до конца оригинальных документов. Я использую NumPy и Scipy.

Я использую Numpy и Scipy. Я попытался использовать islice, поскольку нашел это в другом вопросе, но он просто распечатывает данные.

Мои наборы данных выглядят так:

128  1   0.350   5.175   0.00000000 0.3750000000000000
128  1   0.350   5.175   0.01200000 0.3750000000000000
128  1   0.350   5.175   0.02400000 0.3750000000000000
128  1   0.350   5.175   0.03600000 0.3750000000000000
128  1   0.350   5.175   0.04800000 0.3750000000000000
128  1   0.350   5.175   0.06000000 0.3750000000000000
128  1   0.350   5.175   0.07200000 0.3750000000000000
128  1   0.350   5.175   0.08400000 0.3750000000000000
128  1   0.350   5.175   0.09600000 0.3750000000000000
128  1   0.350   5.175   0.10800000 0.3750000000000000
128  1   0.350   5.175   0.12000000 0.3750000000000000
128  1   0.350   5.175   0.13200000 0.3750000000000000
128  1   0.350   5.175   0.14400000 0.3750000000000000
128  1   0.350   5.175   0.15600000 0.3750000000000000
128  1   0.350   5.175   0.16800000 0.3750000000000000
128  1   0.350   5.175   0.18000000 0.7187500000000000
128  1   0.350   5.175   0.19200000 0.7187500000000000
128  1   0.350   5.175   0.20400000 0.7187500000000000
128  1   0.350   5.175   0.21600000 0.7187500000000000 
128  1   0.350   5.175   0.22800000 0.7187500000000000 
128  1   0.350   5.175   0.24000000 0.7187500000000000 
128  2   0.350   5.175   0.00000000 0.8750000000000000
128  2   0.350   5.175   0.01200000 0.8750000000000000 
128  2   0.350   5.175   0.02400000 0.8750000000000000
...

Во втором столбце показан порядковый номер 20 строк, которые я хочу использовать, объединить с данными из другого документа и записать в третий документ. Порядковый номер идет до 100 - может быть полезно использовать этот номер в цикле, но я не понял, как это сделать.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Я предполагаю, что когда вы говорите «объединить это», вы хотите, чтобы все строки с одинаковым индексом были сгруппированы вместе.Не объединены, как furas, используя zip.

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

Вместо того, чтобы пытаться читать данные и комбинировать их одновременно, явыбрал для чтения всех данных и сортировки их в памяти.Вы говорите, что файлы содержат 20 строк для каждой группы, а количество групп может достигать 100, поэтому у вас есть небольшой набор данных, который легко обрабатывается в памяти.

Код будет искать любые файлы .txtво входном пути загрузите строки как массивы, а затем отсортируйте массивы по второму элементу.Наконец, все строки преобразуются обратно в строки с разделителями табуляции и записываются в файл.

Это решение также будет обрабатывать любое количество входных файлов с помощью os.walk и по-прежнему работать в ситуациях, когда имеются неполные наборы;например, нет 20 строк индекса 2

import os
import re

input_path = './input/'
combined = []

# r=root, d=directories, f = files
for r, d, f in os.walk(input_path):
    for file in f:
        if '.txt' in file:
            with open(os.path.join(input_path, file), 'r') as input_file:
                for line in input_file:
                    combined.append(re.split('\s+', line.strip()))

combined.sort(key=lambda x: x[1])

with open('output.txt', 'w+') as output_file:
    for line in combined:
        output_file.write("\t".join(line)+'\n')
0 голосов
/ 14 мая 2019

Вы можете использовать стандартные open(), readline() и write() для копирования строк из одного файла в другой.

Вместо двух readline() I, используя zip(), вы можете получить строки из обоихфайлы.

Поскольку я не знаю, сколько пробелов может быть между столбцами, поэтому я использую re.split() вместо обычного split()

Я использую второй столбец для создания имени выходных данныхфайл.Я также делаю это для каждой строки, чтобы сделать ее проще - но может быть медленнее открывать и закрывать файл в каждом цикле.

import re

# open input files    
input_file_1 = open('filename_1')
input_file_2 = open('filename_2')

for line_1, line_2 in zip(input_file_1, input_file_2):
    # remove '\n` at the end
    line_1 = line_1.strip()
    line_2 = line_2.strip()

    # create one line to write
    line = line_1 + ' ' + line_2 + '\n'

    # get second column to create filename
    column_2 = re.split('\s+', line_1)[1]
    #print(column_2)

    # open output file, append new line and close it
    output_file = open('output'+column_2, 'a')
    output_file.write(line)
    output_file.close()

# close input files
input_file_1.close()
input_file_2.close()

Пример использования io.StringIO вместо реального файла - так что всеможете скопировать и запустить его для проверки.

data1 = '''128  1   0.350   5.175   0.00000000 0.3750000000000000
128  1   0.350   5.175   0.01200000 0.3750000000000000
128  1   0.350   5.175   0.02400000 0.3750000000000000
128  1   0.350   5.175   0.03600000 0.3750000000000000
128  1   0.350   5.175   0.04800000 0.3750000000000000
128  1   0.350   5.175   0.06000000 0.3750000000000000
128  1   0.350   5.175   0.07200000 0.3750000000000000
128  1   0.350   5.175   0.08400000 0.3750000000000000
128  1   0.350   5.175   0.09600000 0.3750000000000000
128  1   0.350   5.175   0.10800000 0.3750000000000000
128  1   0.350   5.175   0.12000000 0.3750000000000000
128  1   0.350   5.175   0.13200000 0.3750000000000000
128  1   0.350   5.175   0.14400000 0.3750000000000000
128  1   0.350   5.175   0.15600000 0.3750000000000000
128  1   0.350   5.175   0.16800000 0.3750000000000000
128  1   0.350   5.175   0.18000000 0.7187500000000000
128  1   0.350   5.175   0.19200000 0.7187500000000000
128  1   0.350   5.175   0.20400000 0.7187500000000000
128  1   0.350   5.175   0.21600000 0.7187500000000000 
128  1   0.350   5.175   0.22800000 0.7187500000000000 
128  1   0.350   5.175   0.24000000 0.7187500000000000 
128  2   0.350   5.175   0.00000000 0.8750000000000000
128  2   0.350   5.175   0.01200000 0.8750000000000000 
128  2   0.350   5.175   0.02400000 0.8750000000000000'''

import io

input_file_1 = io.StringIO(data1)
input_file_2 = io.StringIO(data1)

import re

#input_file_1 = open('filename_1')
#input_file_2 = open('filename_2')

for line_1, line_2 in zip(input_file_1, input_file_2):
    line_1 = line_1.strip()
    line_2 = line_2.strip()
    line = line_1 + ' ' + line_2 + '\n'

    column_2 = re.split('\s+', line_1)[1]
    print(column_2)

    output_file = open('output'+column_2, 'a')
    output_file.write(line)
    output_file.close()

input_file_1.close()
input_file_2.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...