使用Python

时间:2019-03-23 22:35:29

标签: python split readfile

此方法输入文件和文件目录。它包含一个数据矩阵,需要在给定的行名和该行的相应字母之后复制每行的前20列。跳过每个文件的前3行,因为它具有不需要的不重要信息,并且也不需要文件底部的数据。

例如,文件如下所示:

unimportant information--------
 unimportant information--------
 -blank line
1 F -1 2 -3 4 5 6 7 (more columns of ints)
2 L 3 -1 3 4 0 -2 1 (more columns of ints)
3 A 3 -1 3 6 0 -2 5 (more columns of ints)
-blank line
unimportant information--------
unimportant information--------

该方法的输出需要以某种给定的形式打印出一个“矩阵”。

到目前为止,输出以字符串形式给出了每一行的列表,但是我正在尝试找出解决问题的最佳方法。我不知道如何忽略文件末尾的不重要信息。我不知道如何只检索每行字母后面的前20列,也不知道如何忽略行号和行字母。

def pssmMatrix(self,ipFileName,directory):
    dir = directory
    filename = ipFileName
    my_lst = []

    #takes every file in fasta folder and put in files list
    for f in os.listdir(dir):
        #splits the file name into file name and its extension
        file, file_ext = os.path.splitext(f)

        if file == ipFileName:
            with open(os.path.join(dir,f)) as file_object:

                for _ in range(3):
                    next(file_object)
                for line in file_object:
                        my_lst.append(' '.join(line.strip().split()))
    return my_lst

预期结果:

['-1 2 -3 4 5 6 7'], ['3 -1 3 4 0 -2 1'], ['3 -1 3 6 0 -2 5']

实际结果:

['1 F -1 2 -3 4 5 6 7'], ['2 L 3 -1 3 4 0 -2 1'], ['3 A 3 -1 3 6 0 -2 5'],  [' '], [' unimportant info'], ['unimportant info']  

3 个答案:

答案 0 :(得分:0)

尝试此解决方案。

#include <string>
#include <iostream>

const std::string digits = "0123456789abcdefghijklmnopqrstuvwxyz";

int main()
{
    for (auto a : digits)
    {
        for (auto b : digits)
        {
            for (auto c : digits)
            {
                for (auto d : digits)
                {
                    std::cout << a << b << c << d << '\n';
                    if (a == '1') // stop at 1000
                        return 0;
                }
            }
        }
    }
}

答案 1 :(得分:0)

要删除前两列,您可以更改:

my_lst.append(' '.join(line.strip().split()))

my_lst.append(' '.join(line.strip().split()[2:]))

这将在拆分后的前两列以及将它们重新连接在一起之前删除前两列。

要删除最后3条无关的行,也许最简单的解决方案就是更改:

return my_lst

return my_lst[:-3]

这将返回除最后三行之外的所有内容。

答案 2 :(得分:0)

好吧,在我看来,您的文件中包含所需的某些行,并且所需的行始终以数字开头,后跟一个字母。因此,我们可以做的就是在其中应用一个正则表达式,该表达式仅获取与该模式匹配的行,并且仅获取该模式之后的数字

此表达式看起来像(?<=[0-9]\s[A-Z]\s)[0-9\-\s]+

import re

reg = re.compile(r'(?<=[0-9]\s[A-Z]\s)[0-9\-\s]+')

for line in file:
    if reg.search(line):
        result = reg.search(test).group(0)
        # Use Result
        my_lst.append(' '.join(result))

希望有帮助