我有一个包含以下数据的文件:
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()
?
答案 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