Как вставить случайные пробелы в текстовом файле? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть файл со строками ДНК в файле с именем «DNASeq.txt». Мне нужен код для чтения каждой строки и разбиения каждой строки в случайных местах (вставка пробелов) по всей строке. Каждая строка должна быть разбита в разных местах.

EX: у меня есть: AAACCCHTHTHDAFHDSAFJANFAJDSNFADKFAFJ И мне нужно что-то вроде этого: AAA ADSF DFAFDDSAF ADF ADSF AFD AFAD

Я пытался (!!! очень плохо знаком с Python !!):

import random

for x in range(10):
  print(random.randint(50,250))

но это печатает мне случайные числа. Есть ли способ получить случайное число, сгенерированное как переменная?

Ответы [ 4 ]

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

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

def insert_random_spaces(str):
    from random import randint
    output_string = "".join([x+randint(0,1)*" " for x in str])
    return output_string
0 голосов
/ 13 ноября 2018

Если вы хотите разделить вашу ДНК фиксированное количество раз (10 в моем примере), вот что вы можете попробовать:

import random

DNA = 'AAACCCHTHTHDAFHDSAFJANFAJDSNFADKFAFJ'
splitted_DNA = ''

for split_idx in sorted(random.sample(range(len(DNA)), 10)):
    splitted_DNA += DNA[len(splitted_DNA)-splitted_DNA.count(' ') :split_idx] + ' '
splitted_DNA += DNA[split_idx:]

print(splitted_DNA) # -> AAACCCHT HTH D AF HD SA F JANFAJDSNFA DK FAFJ
0 голосов
/ 13 ноября 2018
import random

with open('source', 'r') as in_file:
  with open('dest', 'w') as out_file:
    for line in in_file:
      newLine = ''.join(map(lambda x:x+' '*random.randint(0,1), line)).strip() + '\n'
      out_file.write(newLine)

Так как вы упомянули, что я новичок, я попытаюсь объяснить

  • Я записываю новые последовательности в другой файл для предосторожности. Это не безопасно записывать в файл, из которого вы читаете.

  • Конструктор with не требует явного закрытия файл, который вы открыли.

  • Файлы можно читать построчно, используя цикл for.

  • ''. Join () преобразует список в строку.

  • map () применяет функцию к каждому элементу списка и возвращает результаты в виде нового списка.

  • лямбда - это то, как вы определяете функцию, не называя ее. lambda x: 2*x удваивает число, которое вы кормите его.

  • x + '' * 3 добавляет 3 пробела после x. random.randint (0, 1) возвращает либо 1, либо 0. Так что я случайно выбираю, добавлю ли я пробел после каждый персонаж или нет. Если random.randint () возвращает 0, добавляется 0 пробелов.

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

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

Создать демонстрационный файл без пробелов:

with open("t.txt","w") as f:
    f.write("""ASDFSFDGHJEQWRJIJG
ASDFJSDGFIJ
SADFJSDFJJDSFJIDFJGIJSRGJSDJFIDJFG
SDFJGIKDSFGOROHPTLPASDMKFGDOKRAMGO""")

Чтение и перезаписьдемонстрационный файл:

import random
max_no_space = 9 # if max sequence length without space
no_space = 0
with open("t.txt","r") as f, open("n.txt","w") as w: 
    for line in f:
        for c in line:
            w.write(c)
            if random.randint(1,6) == 1 or no_space >= max_no_space:
                w.write(" ")
                no_space = 0
            else:
                no_space += 1
with open("n.txt") as k:
    print(k.read())

Вывод:

ASDF SFD GHJEQWRJIJG 
A SDFJ SDG FIJ
SADFJSD FJ JDSFJIDFJG I JSRGJSDJ FIDJFG 

Шаблон пробелов является случайным.Вы можете повлиять на него, установив max_no_spaces или удалив случайность для разделения после max_no_spaces все время


Редактировать:

Этот способ написания 1 символа за раз, если вынужно читать 200+, а блок не очень экономичен, вы можете сделать это с помощью того же кода, например:

with open("t.txt","w") as f:
    f.write("""ASDFSFDGHJEQWRJIJSADFJSDFJJDSFJIDFJGIJSRGJSDJFIDJFGG
ASDFJSDGFIJSADFJSDFJJDSFJIDFJGIJSRGJSDJFIDJFGSADFJSDFJJDSFJIDFJGIJK
SADFJSDFJJDSFJIDFJGIJSRGJSDJFIDJFGSADFJSDFJJDSFJIDFJGIJSRGJSDJFIDJF
SDFJGIKDSFGOROHPTLPASDMKFGDOKRAMGSADFJSDFJJDSFJIDFJGIJSRGJSDJFIDJFG""")


import random
min_no_space = 10
max_no_space = 20 # if max sequence length without space
no_space = 0
with open("t.txt","r") as f, open("n.txt","w") as w: 
    for line in f:
        for c in line:
            w.write(c)
            if no_space > min_no_space:
                if random.randint(1,6) == 1 or no_space >= max_no_space:
                    w.write(" ")
                    no_space = 0
            else:
                no_space += 1
with open("n.txt") as k:
    print(k.read())

Вывод:

ASDFSFDGHJEQ WRJIJSADFJSDF JJDSFJIDFJGIJ SRGJSDJFIDJFGG
 ASDFJSDGFIJSA DFJSDFJJDSFJIDF JGIJSRGJSDJFIDJ FGSADFJSDFJJ DSFJIDFJGIJK
SADFJ SDFJJDSFJIDFJG IJSRGJSDJFIDJ FGSADFJSDFJJDS FJIDFJGIJSRG JSDJFIDJF
SDFJG IKDSFGOROHPTLPASDMKFGD OKRAMGSADFJSDF JJDSFJIDFJGI JSRGJSDJFIDJFG
...