【问题标题】:Python reading a complicated .txt filePython 读取复杂的 .txt 文件
【发布时间】:2012-07-29 03:47:35
【问题描述】:

我有一个包含如下数据的 .txt:

Header:ensembl gene ID|Ensembl Transcript ID|CDS start|CDS end|5'UTR start|5'UTR end|3'UTR start|3'UTR end|Transcripts start|Transcripts end
>ENSMUSG00000002477|ENSMUST00000002551|*some junk information*...etc.|
TCGCGCGTCCGCAGGCCTCCGCGCGCTTTTCCG....etc.
>ENSMUSG00000002835|ENSMUST00000002914|...etc.|
GCAGAAGTGACACCGGTGGGAGGCG...etc.

我写了一些代码来让我知道我有名字 ENSMUSG0000000xxxx

我想从 .txt 的下一行中挑选出我的名字,例如“TACGTACG”以三重形式读取,例如“TAC”“GTA”

然后我想做同样的事情,但不是从第一个字母开始阅读,而是从第二个字母开始,使用上面的示例,它将阅读“ACG”和“TAG”

同样的事情,但跳过前 2 个字母

我真的不知道该怎么做,尤其是阅读 3 个字母的部分。有人可以帮帮我吗?

这些是我到目前为止的代码:

import csv
import os.path
#open files + readlines
with open("C:/Users/Ivan Wong/Desktop/Placement/Lists of targets/Mouse/UCSC to Ensembl.csv", "r") as f:
reader = csv.reader(f, delimiter = ',')
#find files with the name in 1st row
for row in reader:
    graph_filename = os.path.join("C:/Users/Ivan Wong/Desktop/Placement/Interesting reading/3'ORF",row[0]+"_nt_counts.txt.png")
    if os.path.exists(graph_filename):
        y = row[0]+'_nt_counts.txt'  
        r = open('C:/Users/Ivan Wong/Desktop/Placement/fp_mesc_nochx/'+y, 'r')
        k = r.readlines()
        r.close
        del k[:1]
        k = map(lambda s: s.strip(), k)
        interger = map(int, k)   
        import itertools
        #adding the numbers for every 3 rows
        def grouper(n, iterable, fillvalue=None):
            "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
            args = [iter(iterable)] * n
            return itertools.izip_longest(*args, fillvalue=fillvalue)
        result = map(sum, grouper(3, interger, 0))
        e = row[1]
cDNA = open('C:/Users/Ivan Wong/Desktop/Placement/Downloaded seq/Mouse/cDNA.txt', 'r')
q = cDNA.readlines()
cDNA.close
#To delete the 1st line that I do not want at all
del q[:1]

现在我只有一个想法,我想逐步分解它们

第一个:我想从我的 .txt(命名为 q)中找出列表中的名称(我将其命名为 e)

第二个:我想让它读取下一行,直到它到达另一个名字(e)

第三:将我读到的那些行分成一个字符串,例如“A”、“T”、“C”、“G”、“A”、“A”等。

第 4 步:读取 3 个字母 - “ATC”、“GAA”

第 5 步:将它们写入文件,然后返回第 4 步,但这次要从第 2 个字母开始

6th:基本上是第 5 步,但这次从第 3 个字母开始

虽然我有这个想法,但我没有这样做的编程知识,请有人帮助我

【问题讨论】:

  • 这是一项作业,您正在寻找提示吗?如果不是那么whathaveyoutried?
  • 好吧不是真正的任务,而是某种形式的工作。整个过程涉及读取一个包含 2 列的文件,其中 1 列的名称用于识别另一部分的内容。第 2 列是我想在此 .txt 中标识的名称。到目前为止,我已经阅读了文件,经理将 2 列分开并阅读了它们。
  • 如果您下次尝试发布,您将获得更多帮助
  • 我很想发布一个尝试,但是这个,我不知道从哪里开始以及如何开始,因此我没有尝试。除非你想看我以前写的所有代码,这让我进入了名单
  • 我估计有一天会有人将所有的 DNA sn-ps 放在 SO 上,然后制作一个科学怪人之类的!! :)

标签: python python-2.7


【解决方案1】:

由于这不是家庭作业,这里有一个开始的方法。假设您感兴趣的行是那些不以 '>' 开头的行,切片操作将在这里有所帮助。

with open('data.txt') as inf:
    for line in inf:
        if not line.startswith('>'):
            strings3 = [line[i:i+3]for i in range(len(line))]

将在每一行收集您感兴趣的 3 个字母序列:

输入行:

GCAGAAGTGACACCGGTGGGAGGCG

输出

['GCA', 'CAG', 'AGA', 'GAA', 'AAG', 'AGT', 'GTG', 'TGA', 'GAC', 'ACA', 'CAC', 'ACC', 'CCG', 'CGG', 'GGT', 'GTG', 'TGG', 'GGG', 'GGA', 'GAG', 'AGG', 'GGC', 'GCG', 'CG\n', 'G\n', '\n']

请注意,如果行中的字符数不能被 3 整除,您将得到一些较短的字符串和一些换行符。

您还可以重新使用您最近提出的另一个问题中的grouper 函数。

【讨论】:

  • 我想用strings3 = [[line[i:i+3] for i in xrange(j, len(line), 3)] for j in xrange(3)] 扩展它。这只是将字符串分组为三个列表,以便可以连接每个列表中的字符串以重新创建输入行。我认为这就是他想要的字符串排序方式。
  • 我尝试了这些代码,但它似乎不起作用。它说 q as inf: AttributeError: exit 另外,因为 txt 文件有大约 3000 个这些名称及其序列,而我只想要列表中的 50 个,所以我不认为这里的代码可以解决这个问题
  • @ivanhoifung 当然只有你可以决定是否适合,但我对错误感到困惑(甚至不确定它是什么,我的代码中没有q)。我在发布之前测试了代码。
  • @Levon q 是我的代码中的 .txt,经过一些修改,因此它没有一些我不想要的垃圾。但是即使我尝试了 cDNA,也就是我命名的 open(file),由于某种原因它仍然对我不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2017-08-29
  • 2020-12-27
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多