我正在尝试编写一个程序,该程序计算字符串末尾的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个字符。
我想为自己编写代码,所以我不想导入任何模块。
谢谢。
答案 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_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)