Разделение строки на список целых чисел с помощью Python

#python #split #readfile

#python #разделение #readfile

Вопрос:

Этот метод вводит файл и каталог файла. Он содержит матрицу данных и должен скопировать первые 20 столбцов каждой строки после заданного имени строки и соответствующей буквы для строки. Первые 3 строки каждого файла пропускаются, потому что в них содержится неважная информация, которая не нужна, а также не нужны данные в нижней части файла.

Например, файл будет выглядеть как:

 unimportant information--------
 unimportant information--------
 -blank line
1 F -1 2 -3 4 5 6 7 (more columns of ints)
2 L 3 -1 3 4 0 -2 1 (more columns of ints)
3 A 3 -1 3 6 0 -2 5 (more columns of ints)
-blank line
unimportant information--------
unimportant information--------
  

На выходе метода необходимо распечатать «матрицу» в некоторой заданной форме.

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

 def pssmMatrix(self,ipFileName,directory):
    dir = directory
    filename = ipFileName
    my_lst = []

    #takes every file in fasta folder and put in files list
    for f in os.listdir(dir):
        #splits the file name into file name and its extension
        file, file_ext = os.path.splitext(f)

        if file == ipFileName:
            with open(os.path.join(dir,f)) as file_object:

                for _ in range(3):
                    next(file_object)
                for line in file_object:
                        my_lst.append(' '.join(line.strip().split()))
    return my_lst
  

Ожидаемые результаты:

 ['-1 2 -3 4 5 6 7'], ['3 -1 3 4 0 -2 1'], ['3 -1 3 6 0 -2 5']
  

Фактические результаты:

 ['1 F -1 2 -3 4 5 6 7'], ['2 L 3 -1 3 4 0 -2 1'], ['3 A 3 -1 3 6 0 -2 5'],  [' '], [' unimportant info'], ['unimportant info']  
  

Ответ №1:

Попробуйте это решение.

     import re
    reg = re.compile(r'(?<=[0-9]s[A-Z]s)[0-9-s] ')

    text = """
    unimportant information--------

    unimportant information--------
    -blank line

    1 F -1 2 -3 4 5 6 7 (more columns of ints)

    2 L 3 -1 3 4 0 -2 1 (more columns of ints)

    3 A 3 -1 3 6 0 -2 5 (more columns of ints)"""

    ignore_start = 5  # 0,1,2,3 =  4
    expected_array = []
    for index, line in enumerate(text.splitlines()):
    if(index >= ignore_start):
            if reg.search(line):
            result = reg.search(line).group(0).strip()
            # Use Result
            expected_array.append(' '.join(result))

    print(expected_array)
    # Result: [
    #'- 1   2   - 3   4   5   6   7', 
    #'3   - 1   3   4   0   - 2   1', 
    #'3   - 1   3   6   0   - 2   5'
    #]
  

Комментарии:

1. выходные данные не распознают отрицательные числа как цифру. есть ли другой способ добавления отрицательных значений?

2. знаете ли вы, как объединить только x-количество чисел в каждой строке? принимая во внимание ваш пример, для чего мне нужны только первые 3 числа каждого из них вместо всех 7 чисел?

3. @Rachel Вам нужно выполнить mystring = ‘ ‘.join(результат). split(‘ ‘)[2:] это вернет массив, удалив первые 3 пробела, в этом случае для первой строки будет 1 F -1, и вы получите 2 -3 4 5 6 7 вместо 1 F -1 2 -3 4 5 6 7

Ответ №2:

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

Выражение для этого будет выглядеть следующим образом (?<=[0-9]s[A-Z]s)[0-9-s]

 import re

reg = re.compile(r'(?<=[0-9]s[A-Z]s)[0-9-s] ')

for line in file:
    if reg.search(line):
        result = reg.search(test).group(0)
        # Use Result
        my_lst.append(' '.join(result))
  

Надеюсь, это поможет