如何在Python中只使用一个循环迭代文件?

时间:2014-08-16 13:01:06

标签: python

我有一个包含以下数据的文件:

aaa97k:kkddd3046<br />
adfteak:xk666665<br />
ssyuri2:7r6669p<br />
k2fdf2k2:sgp54fa<br />

我想删除说<br />

的部分

我找到了一个代码:

def main():
    fileR=open("data.txt","r")
    for line in (line.rstrip() for line in fileR):
        if line.endswith('<br />'):
            line=line[:-6]
            print line

对于我对这段代码的理解,内部循环遍历每一行并返回每一行而没有新的行字符,我是对的吗?然后使用这些数据继续摆脱<br />部分。

我想知道是否有办法只使用一个循环而且可能不需要使用rstrip()

4 个答案:

答案 0 :(得分:2)

“第二个循环”只是一个生成器表达式。它基本上与实际循环并行运行;第一个循环的每次迭代只是从第二个循环读取一个新值。这只是一种更为出色的写作方式

for line in fileR:
    line = line.rstrip()

避免第二次分配到line(第一次是由for循环本身)的稍微更好的方法是使用

from itertools import imap
from operator import methodcaller
stripper = methodcaller("rstrip")
for line in imap(stripper, fileR):

答案 1 :(得分:1)

循环是生成器表达式;循环本身并不嵌套为 chained

您可以删除它并手动说明换行符,当然。但是你不会得到任何东西:

for line in fileR:
    if line.endswith('<br />\n'):
        line = line[:-7]
        print line

现在您需要测试该行是否以<br /> 加上换行符结束。

请注意,如果文件中的最后一行不以换行符结尾,则上述代码将失败。 str.rstrip()剥离的不仅仅是换行符;如果<br />文本后面有(可变的)空格数,则上述代码也不会处理这些空格。

答案 2 :(得分:0)

您可以遍历split字符上的每一行'<',然后抓住拆分的第一部分。

with open("data.txt","r") as fileR:
    for line in fileR:
        line = line.split('<')[0]
        print line

答案 3 :(得分:0)

如果你需要带有线条的原始文件,你可以将它们存储在一个变量中(你是怎么做的),你可以对它们进行进一步的操作。

否则,如果你只是在阅读时做一些操作,那么rstrip()应该适合。这是脚本的较小版本:

with open('data.txt') as f:
    for line in f:
        print(line.rstrip('<br />')) # or do something else

    # the with statement cloeses the file automatically