【问题标题】:Python- Reading whole txt file as 1 linePython-将整个txt文件读取为1行
【发布时间】:2016-01-01 07:17:43
【问题描述】:

如果我有一个 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)

【问题讨论】:

  • 每行的符号数是多少?
  • 我不太确定你要的是什么
  • 您的示例包含长度为 37 的行。这是有意的吗?
  • 不,我是随机添加的,实际上它有 210 个

标签: python


【解决方案1】:
raw_txt = ''.join(line.rstrip('\n') for line in f.readlines())

或如@PM 2Ring 建议的那样:

raw_txt = ''.join(f.read().splitlines())

【讨论】:

  • 如果您可以保证文件以换行符结尾,您可以使用''.join([line[:-1] for line in f.readlines()])。 OTOH,我更喜欢''.join(f.read().splitlines())
【解决方案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

【讨论】:

  • 为什么迭代文件对象更智能?
  • @Basilevs,因为您不会无缘无故地在内存中保留文件的另一个副本"".join([line.rstrip() for line in f.readline()]) 最终会在内存中得到文件的三个副本,列表 comp、连接和readlines 调用。
【解决方案3】:

只需阅读整个文件并删除新行:

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'))

【讨论】:

  • 当然,如果您希望将这些三元组解码为氨基酸,则无需构建它们的列表,您可以执行for triplet in getTriplets(getCharacters('file')):aa = codon[triplet] 之类的操作,其中codondict 由三重字符串索引的氨基酸。
  • 你能解释一下“def getTriplets”吗? "iter" 和 zip(*) 是做什么的
  • @Donka 那是function definitioniter 从一个可迭代对象中创建一个迭代器,zip 组合了多个可迭代对象。如果你真的不知道什么是函数,请阅读教程……
  • 是的,我做到了。非常感谢您的回答。它帮了我很多
【解决方案4】:

我不知道我是否已经解决了这个问题, 但请测试我的代码。

我刚刚修改了你的代码。

正如您在某些 cmets 中提到的,您希望在文件中间去除换行符。

因此,为此我没有删除它,而是将 '\n' 替换为 '',使用

rtxt = raw_txt.replace('\n', '')

这里是代码:

fob = open("Exercise.txt", "r")
def read_from_file(filename): 
    raw_txt = filename.read()
    rtxt = raw_txt.replace('\n', '')
    triplets = [rtxt[i:i+3] for i in range(0, len(rtxt), 3)]
    print triplets
read_from_file(fob)

三元组列表中的输出:

['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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2017-08-29
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多