【问题标题】:readline() returns bracketreadline() 返回括号
【发布时间】:2016-08-03 01:09:52
【问题描述】:

我编写了一些代码来从 .txt 中获取一些行,如下所示,它不断返回带有括号的行,这是我不打算的。你能帮帮我吗?

代码:

#!/bin/python
i=1
f=open("name.txt","r")
while(i<=225):
 x=f.readline().splitlines()
 print("mol new %s.bgf"%(x))
 i+=1
f.close()

名称.txt

02.ala.r49r50.TRK820.no_0.rnd_1.c14421.f.c
04.ala.r44r45.TRK820.no_0.rnd_1.c48608.h.c
09.ala.r46r47.TRK820.no_0.rnd_1.c14682.t.c
17.ala.r47r48.TRK820.no_0.rnd_1.c9610.th.c
18.ala.r48r49.TRK820.no_59.rnd_1.c19106.t.c

然后它返回

mol new ['02.ala.r49r50.TRK820.no_0.rnd_1.c14421.f.c'].bgf
mol new ['04.ala.r44r45.TRK820.no_0.rnd_1.c48608.h.c'].bgf
mol new ['09.ala.r46r47.TRK820.no_0.rnd_1.c14682.t.c'].bgf
mol new ['17.ala.r47r48.TRK820.no_0.rnd_1.c9610.th.c'].bgf
mol new ['18.ala.r48r49.TRK820.no_59.rnd_1.c19106.t.c'].bgf

【问题讨论】:

  • 那是因为您使用的是splitlines。代替x=f.readline().splitlines(),试试x=f.readline().strip()
  • 感谢@SIMONSON92 创建了一个简短而完整的示例程序。拥有完整的样本使读者的生活变得更加轻松。请参阅minimal reproducible example 了解更多信息。

标签: python readline


【解决方案1】:

对您的代码进行最小的更改,尝试:

i=1
f=open("name.txt","r")
while(i<=225):
 x=f.readline().rstrip('\n')
 print("mol new %s.bgf"%(x))
 i+=1
f.close()

这会产生如下输出:

mol new 02.ala.r49r50.TRK820.no_0.rnd_1.c14421.f.c.bgf
mol new 04.ala.r44r45.TRK820.no_0.rnd_1.c48608.h.c.bgf
mol new 09.ala.r46r47.TRK820.no_0.rnd_1.c14682.t.c.bgf
mol new 17.ala.r47r48.TRK820.no_0.rnd_1.c9610.th.c.bgf
mol new 18.ala.r48r49.TRK820.no_59.rnd_1.c19106.t.c.bgf

进一步改进:

with open("name.txt","r") as f:
    for i, line in enumerate(f):
        if i >= 225:
            break
        print("mol new %s.bgf"%(line.rstrip('\n')))

注意事项:

  1. 您想使用with open("name.txt","r") as f 来确保文件f 无论如何都会关闭。

  2. 循环遍历i 作为i=1; while(i&lt;=225): i+=1 中的计数器不是pythonic。请改用枚举。

  3. readline 读入一行。不需要splitlines

  4. 通过使用for i, line in enumerate(f): 循环遍历文件中的行,我们消除了一次读取整个文件的需要。这使得该程序适合处理非常大的文件。

  5. 在python中,当从文件中读取一行时,它的末尾仍然有换行符。我们使用rstrip('\n') 安全地删除它。

【讨论】:

    【解决方案2】:

    readline 函数从文件中读取一行。然后,您要求将该行拆分为 list 行(这将给您一个仅包含一行的列表,因为这就是您所拥有的)。

    不要拆分单行。而是 strip 字符串(删除前导和尾随的“空白”)。

    有关splitlinesstrip 的更多信息,请阅读the string reference

    【讨论】:

    • 您提出什么解决方案?
    • 我想知道如何在代码中实现它。我现在了解您的新编辑。谢谢
    【解决方案3】:

    你不需要对readline()的结果调用splitlines()方法

    file.readline() 返回文件的一行,包括结尾的换行符。

    .splitlines() 通过将换行符用作分隔符来摆脱换行符,并为您提供只有一项的行列表。括号来自该 1 项列表的 str 表示

    你想要这个:

    x = f.readline().rstrip()
    

    删除换行符,或者您也可以像这样切片换行符

    x = f.readline()[:-1]
    

    您可能会考虑的另一件事是更改代码以将文件对象用作可迭代对象。用 Python 写比较惯用

    for line in fileobject:
        print line[:-1]
    

    比使用 while 循环和 .readline()

    【讨论】:

    • line.rstrip() 甚至 line.rstrip('\n') 会不会更惯用?
    • 好问题 - 我确实在答案的第一部分中使用了 .rstrip() ,因为我确实认为更明显的是名为 rstrip 的方法将删除一些东西:-)
    【解决方案4】:

    这是因为f.readline().splitlines() 以包含单个元素的列表形式返回该行。

    试试这个:

    x = f.readline().splitlines()
    x = x[0]
    

    【讨论】:

    • @Robᵩ 是的...对不起,我在"[string]" 上测试而不是["string"]
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2012-02-08
    • 2020-07-17
    相关资源
    最近更新 更多