参考另一个 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()
...
我已经为此工作了一段时间,但我对此感到非常沮丧。基本上,我有两个包含重要信息的文本文档。第一个文档包含我要提取的一些信息(染色质名称、起点和终点),我想使用这些信息在第二个文本中搜索信息(我想计算由定义的每个块的 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()
...