【问题标题】:How to insert random spaces in txt file?如何在txt文件中插入随机空格?
【发布时间】:2019-04-16 18:02:42
【问题描述】:

我在一个名为“DNASeq.txt”的文件中有一个包含 DNA 行的文件。我需要一个代码来读取每一行并在整行的随机位置(插入空格)拆分 each 行。每行需要在不同的地方分割。

EX:我有: AAACCTHTHDAFHDSAFJANFAJDSNFADKFAFJ 我需要这样的东西: AAA ADSF DFAFDDSAF ADF ADSF AFD AFAD

我已经尝试过(!!!对 python 来说非常新!!):

import random

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

但这会打印出随机数。有没有办法让随机数像变量一样生成?

【问题讨论】:

  • 你的分割数是固定的,还是随机的?

标签: python python-3.x insert spaces


【解决方案1】:

您可以逐行读取文件,在新文件中逐行写入每行并随机插入空格:

创建不含空格的演示文件:

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 之后一直分裂的随机性


编辑:

如果你需要读取 200+ 个 en 块,这种一次写入 1 个字符的方式不是很经济,你可以使用相同的代码来做到这一点:

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

【讨论】:

  • 谢谢一百万。我真的很感激!
  • 有没有办法设置不带空格的最小序列长度?我正在尝试获得长度范围约为 200-500 个碱基对的序列,并且代码很棒,我只需要在插入空格之前设置一个最小长度(单独没有单个碱基对)。非常感谢您的帮助!非常感谢!!!
【解决方案2】:

如果您想拆分 DNA 固定次数(在我的示例中为 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

【讨论】:

  • 非常感谢您的宝贵时间!!我很感激!
【解决方案3】:
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 是您在不命名函数的情况下定义函数的方式。 lambda x: 2*x 将您输入的数字加倍。

  • x + ' ' * 3 在 x 后添加 3 个空格。 random.randint(0, 1) 返回 1或0。所以我随机选择是否在之后添加空格 每个字符与否。如果 random.randint() 返回 0,则添加 0 个空格。

【讨论】:

    【解决方案4】:

    您可以在每个字符后掷硬币,无论是否添加空格。 此函数将字符串作为输入,并返回在随机位置插入空格的输出。

    def insert_random_spaces(str):
        from random import randint
        output_string = "".join([x+randint(0,1)*" " for x in str])
        return output_string
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2021-02-23
      相关资源
      最近更新 更多