有没有办法在Python中向后读取行?

时间:2019-03-25 10:00:03

标签: python-3.x

我正在尝试编写一个程序,该程序计算字符串末尾的N个数。 我有一个包含许多行唯一序列的文件,我想测量序列以N结尾的频率以及N序列的长度。例如,文件输入将如下所示:

NTGTGTAATAGATTTTACTTTTGCCTTTAAGCCCAAGGTCCTGGACTTGAAACATCCAAGGGATGGAAAATGCCGTATAACNN
NAAAGTCTACCAATTATACTTAGTGTGAAGAGGTGGGAGTTAAATATGACTTCCATTAATAGTTTCATTGTTTGGAAAACAGN
NTACGTTTAGTAGAGACAGTGTCTTGCTATGTTGCCCAGGCTGGTCTCAAACTCCTGAGCTCTAGCAAGCCTTCCACCTCNNN
NTAATCCAACTAACTAAAAATAAAAAGATTCAAATAGGTACAGAAAACAATGAAGGTGTAGAGGTGAGAAATCAACAGGANNN

理想情况下,代码将逐行读取文件并计算以'N'结尾的行的频率。

然后,如果一行以N结尾,则应向后读取每个字符以查看N字符串的长度。此信息将用于计算以N结尾的行的百分比,以及N个字符串的平均值,众数,中位数和范围。 这是我到目前为止所拥有的。

filename = 'N_strings_test.txt'

n_strings = 0
n_string_len = []
with open(filename, 'r') as in_f_obj:
    line_count = 0
    for line in in_f_obj:  
        line_count += 1
        base_seq = line.rstrip()  
        if base_seq[-1] == 'N':
            n_strings += 1
            if base_seq[-2] == 'N':
                n_string_len.append(int(2))
            else:
                n_string_len.append(int(1))
print(line_count)
print(n_strings)
print(n_string_len)

我得到的只是索引超出范围错误,但是我不明白为什么。另外,到目前为止,我只能使用2个字符。

我想为自己编写代码,所以我不想导入任何模块。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可能会得到IndexError,因为您的文件中有空行!


两种声音方法。首先是通用的:使用reversed()反向迭代行:

line = line.rstrip()
count = 0
for c in reversed(line):
    if c != 'N':
        break
    count += 1

# count will now contain the number of N characters from the end

另一个修改字符串的方法甚至更容易,是rstrip()所有空格,获取长度,然后rstrip()所有N。尾随N的数量是长度的差异:

without_whitespace = line.rstrip()
without_ns = without_whitespace .rstrip('N')
count = len(without_whitespace) - len(without_ns)

答案 1 :(得分:0)

这段代码是:

  • 逐行阅读
  • 反转字符串并lstrip对其进行处理。倒车不是必需的,但它会使事情变得自然。
  • 读取最后一个字符,如果 N 则递增
  • 继续阅读该行直到我们有 N 个流
n_string_count, n_string_len, line_count = 0, [], 0
with open('file.txt', 'r') as input_file:
    for line in input_file:
        line_count += 1
        line = line[::-1].lstrip()
        if line:
            if line[0] == 'N':
                n_string_count += 1
                consecutive_n = 1
                while consecutive_n < len(line)  and line[consecutive_n] == 'N': consecutive_n += 1
                n_string_len.append(consecutive_n)
print(line_count)
print(n_string_count)
print(n_string_len)