参考另一个 txt 编写 python 分块循环

Writing python chunking loops with reference to another txt

我已经为此工作了一段时间,但我对此感到非常沮丧。基本上,我有两个包含重要信息的文本文档。第一个文档包含我要提取的一些信息(染色质名称、起点和终点),我想使用这些信息在第二个文本中搜索信息(我想计算由定义的每个块的 atgc起点和终点)。所以我试图提取开始结束序列号,然后使用这些序列号对每个频率的 atcg 频率进行分块和计数。我觉得我快接近了,但我最大的问题是如何使用从第一个文本中提取的起点和终点,并将它们用作第二个文本中制作块的起点和终点?

这是我目前的情况:

from __future__ import division
import nltk, re, pprint, subprocess

f = open('first_text.txt') #this text has chromatin name, start/end points
raw = f.read()
raw = read.lower ()
l = raw.splitlines() #these next few lines are just for formatting
l = [re.sub(r'\t', '', l) for l in l] #and getting rid of stuff I don't want

datas = []
for elem in l:
    datas.append(elem.strip().split(' '))

wanted_stuff = []
for datas in datas:
    wanted_stuff.append(datas[0:3]) #extracting chromatin name, start, end
    # and making a list of [name, start, end]'s.
    # for example: ['chr1', '10000', '106000'] is on one line, etc. 
    # next line is another ['chrx', 'start number', 'end number'], and so on

chroms = []
starts = []
ends = []
for wanted_stuff in wanted_stuff:
    chroms.append(wanted_stuff[0])
    starts.append(wanted_stuff[1])
    ends.append(wanted_stuff[2])    

start_stop = [slice(int(starts), int(stops)) for chroms, starts, stops in wanted_stuff]

print start_stop # ValueError: too many values to unpack

f.close()

f = open('dna.txt')
fdna = f.read()
fdna = fdna.lower()
format1 = re.sub(r'chr, '', fdna) #getting rid of stuff I don't want
my_format = re.sub(r'[^atcg]', '', format1)

# SOME KIND OF CHUNKING MAGIC HERE?!?!?!

total = len(my_format)
n_bits =  my_format.count('n')
a_bits =  my_format.count('a')
t_bits =  my_format.count('t')
g_bits =  my_format.count('g')
c_bits =  my_format.count('c')

def percentage(count, total):
    return 100 * count / total
f.close() 

现在这只是打印一长串数字,计算每块 600 个字符中有多少个 a。但是,我想弄清楚如何根据 first_text 的结果来定义这些块。 (即对于结果 "chrom1, 10000, 10600",在我的代码的第二部分中,我希望 10000 开始,10600 结束,然后遍历所有开始和结束,以计算 "a"在每个后备箱中。如果我能 return 这样的结果,"Chrom1, chunk 10000 - 10600 has 175 a's",我会很高兴!

谁能帮帮我?我不是一个很好的程序员......我知道我的一些代码是多余的。无论如何,非常感谢任何输入!

编辑以清理一些东西: 起点和终点的提取正在运行。如果我

print wanted_data

我的成绩是

"['Chrom1', '10000', '10600'], ['Chrom1', '10600', '12300'], ['Chrom1', '12300', '17000'], ['Chrom1', '17000', '21000]', ...."

还有很多。每个中的第一个数字是起点(例如 10000)。第二点是每组的终点(例如10600)

编辑 - 起点和终点应该是块的起点和终点。所以我想使用 10000 和 106000 来查找 format2[10000:106000] 并计算这个块中的 a,然后对我得到的所有开始和结束执行此操作。

稍微清理一下;您可以在拆分 raw 之前删除所有选项卡。

raw = read.lower ()
raw = re.sub(r'\t', '', raw)
l = raw.splitlines() #these next few lines are just for formatting

您想改为保存所有提取的数据 - 这是使用列表的一种方法。

wanted_stuff = []
for datas in datas:
    wanted_stuff.append(data[0:3]) #extracting chromatin name, start, end
# or as a list comprehension
#wanted_stuff = [data[:3] for data in datas]

如果您的数据如下所示:

a = [['Chrom1', '10000', '10600'], ['Chrom1', '10600', '12300'],
     ['Chrom1', '12300', '17000'], ['Chrom1', '17000', '21000']]

您可以创建 slice 个对象的列表:

start_stop = [slice(int(start), int(stop)) for c, start, stop in a]
#if you need to conserve resources or time, use a generator expression
#start_stop = (slice(int(start), int(stop)) for c, start, stop in a)

使用 list comprehension 创建 start_stop。写成传统的 for 循环看起来像这样:

start_stop = []
for c, start, stop in a:
    start_stop.append(slice(start, stop))

这使用拆包来分离项目:

>>> thing = ['Chrom1', '10000', '10600']
>>> c, start, stop = thing
>>> c
'Chrom1'
>>> start, stop
('10000', '10600')
>>>

slice 对象可用于索引到序列中:

>>> s = 'abcdefg'
>>> items_123 = slice(1, 4)
>>> s[items_123]
'bcd'
>>> s[1:4]
'bcd'
>>> 

start_stop 是一个包含 slice objects 的列表,可用于从 format2

中提取所需的文本
chunks = [format2[chunk] for chunk in start_stop]

展开作为for循环:

chunks = []
for chunk in start_stop:
    chunks.append(format2[chunk])

您好像忘记关闭第二个文件了。您可以通过使用 with 关键字在上下文管理器中使用文件来避免该错误:

with open('dna.txt') as f:
    fdna = f.read()

fdna = fdna.lower()
...