#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))
Надеюсь, это поможет