【问题标题】:Writing python chunking loops with reference to another txt参考另一个txt编写python分块循环
【发布时间】:2015-10-17 02:38:21
【问题描述】:

我已经为此工作了一段时间,对此我感到非常沮丧。基本上,我有两个文本文档,它们都包含重要信息。第一个文档包含我要提取的一些信息(染色质名称、起点和终点),我想使用这些信息来搜索第二个文本中的信息(我想计算由起点和终点)。所以我试图提取起始序列号,然后使用它们对每个频率的 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”在每个主干中。如果我可以返回类似“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,然后对我得到的所有开始和结束执行此操作。

【问题讨论】:

  • 起点和终点的提取工作正常吗?请提供提取数据的简要示例。
  • 在循环中,for datas in datas: 每次迭代都会覆盖wanted_stuff - 它只会在迭代完成时包​​含最后一个item
  • 什么是“开始和结束”?字符偏移到第二个文件?线偏移?还有什么?您能否为我们提供一个您正在使用的数据的示例?
  • 我在底部进行了编辑和澄清。同时,二战,如果我需要保留所有这些,我是否应该将结果附加到一个空列表中?
  • @wwii,感谢您注意到这一点。我将它附加到一个空列表中,并将为此编辑我的原始帖子。

标签: python generics text input chunking


【解决方案1】:

稍微清理一下;您可以在拆分之前删除 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()
...

【讨论】:

  • 谢谢!我已经清理了您建议的部分(我将在此之后更新原始帖子)但我仍然有一些问题。首先,当我“打印 list Wanted_stuff”时,我得到了正确的格式,但是当我只是“打印 Want_stuff”时,我得到了你所展示的内容。有什么具体原因吗?我还在学习如何使用生成器表达式,所以我会尝试!我不完全理解定义 start_stop 的代码行。如何获取数字并使它们开始/停止?还有,什么是“c”和“a”。由于我正在寻找 dna,我不想使用 atcg
  • 另外,当我用这个添加运行它时,我得到一个错误。编辑:第 23 行 start_stop = [slice(int(start), int(stop)) for c, start, stop in a] NameError: name 'a' is not defined.
  • @SnarkShark, name 'a' is not defined. 在我的回答中,示例数据分配给 a 所以这就是我在代码中使用的 - 您需要调整数据的名称。 slice .. slice object.你可能对collections.Counter也感兴趣
  • 不幸的是,我仍然不太了解那行代码以及如何将 10000 映射到开始并将 106000 映射到结束。我将那行代码读为“名为 start_stop 的东西是一对名为 start 的整数和另一个名为 stop 的整数,并且......”。我不明白“for c, start, stop in a”。就我的目的而言,它是否类似于“对于块,开始于开始,结束于结束”......但我还需要弄清楚如何循环它。
  • 感谢您的更新!我仍然坚持获取切片对象列表并对“c”感到困惑,因为您没有在您的代码或我的代码中定义它。 “a”相当于“wanted_stuff”,对吧。我收到错误“ValueError:解包的值太多。”
猜你喜欢
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多