如果我有一个txt文件,它包含这样的内容:
AGCGTTGATAGTGCAGCCATTGCAAAACTTCACCCTA
AGCGTTGATAGTGCAGCCATTGCAAAACTTCACCCTA
AAGAAACGAGTATCAGTAGGATGCAGACGGTTGATTG
但是有" \ n"线之间。
现在如果我想从他们身上制作三胞胎。那么有没有办法将整个txt文件作为一行阅读,所以它不会给我:
'CAA', 'TGC', '\nAG', 'CGT', 'TGA', 'TAG', 'TGC', 'AGC',
我上传了我现有的全部代码,因为没有一个给定的答案似乎有帮助 这就是我用来将整个字符串拆分为三元组的代码:
fob = open("Exercise.txt", "r")
def read_from_file(filename):
raw_txt = filename.read()
triplets = [raw_txt[i:i+3] for i in range(0, len(raw_txt), 3)]
read_from_file(fob)
答案 0 :(得分:2)
raw_txt = ''.join(line.rstrip('\n') for line in f.readlines())
或@PM 2Ring建议:
raw_txt = ''.join(f.read().splitlines())
答案 1 :(得分:2)
你不需要调用readlines,只需遍历文件obejct rstripping每一行:
with open("test.txt") as f:
line = "".join([line.rstrip() for line in f])
或者将其与map
:
with open("test.txt") as f:
line = "".join(list(map(str.rstrip,f)))
rstrip
也会处理你的行结尾,不需要传递任何参数。
如果你想切片只需在连接的字符串上调用iter
并压缩:
line = iter("".join(list(map(str.rstrip, f))))
for sli in zip(line, line, line):
print("".join(sli))
如果您的数据不是3的倍数且您不想丢失它,则可以使用itertools.zip_longets:
from itertools import zip_longest
with open("test.txt") as f:
line = iter("".join(list(map(str.rstrip, f))))
for sli in zip_longest(line,line,line, fillvalue=""):
print("".join(sli))
在您的样本输入上,两者都将输出:
AGC
GTT
GAT
AGT
GCA
GCC
ATT
GCA
AAA
CTT
CAC
CCT
AAG
CGT
TGA
TAG
TGC
AGC
CAT
TGC
AAA
ACT
TCA
CCC
TAA
AGA
AAC
GAG
TAT
CAG
TAG
GAT
GCA
GAC
GGT
TGA
TTG
答案 2 :(得分:1)
只需阅读整个文件并删除新行:
with open('file') as f:
text = f.read().replace('\n', '')
triplets = [text[i:i+3] for i in range(0, len(text), 3)]
您还可以避免将整个文件读入内存并在选择三元组时迭代读取。你甚至可以通过使用生成器函数和函数组合使这非常懒惰(这使它非常实用):
def getCharacters (fileName):
with open(fileName) as f:
for line in f:
yield from line.rstrip()
def getTriplets (source):
it = [iter(source)] * 3
for triplet in zip(*it):
yield ''.join(triplet)
# and get a list of triplets
triplets = list(getTriplets(getCharacters('file'))
答案 3 :(得分:0)
我不知道我是否已经解决了这个问题, 但要测试我的代码。
我刚修改了你的代码。
正如您在某些评论中提到的那样,您希望在文件中间删除换行符。
所以为此,我没有剥夺它,但我更换了' \ n'与'',使用
int
这是代码:
float
三元组列表中的输出:
rtxt = raw_txt.replace('\n', '')