为什么我的脚本只适用于我的文本文件的最后一行?

时间:2015-06-30 15:36:17

标签: python

我正在使用Python 2,并且我正在阅读一个包含400个域名(由新行分隔)的文件到我的脚本中,测试它们是否符合表达式' *。&#39 ;如果他们这样做,将它们保存到列表并将列表写入新的.txt。但是,脚本只会获取文件中的最后一个.in域,还有几个。有什么想法吗?

    #!/usr/bin/python

from fnmatch import fnmatch

newDomains = []


with open ('fishDomains.txt', 'r+') as f:
    for line in f:
        print line
        if fnmatch(line, '*.in') is True:
            print line
            newDomains.append(line)

with open('newFishDomains.txt', 'r+') as c:
    for item in newDomains:
        #print item
        c.write(item)
        c.write("\n")

2 个答案:

答案 0 :(得分:1)

for line in f其中f是一个打开的文件,返回整行,包括终止换行符。

您想要删除该行,并且可能不会将fnmatch用于内置字符串函数可以执行的操作。

with open ('fishDomains.txt', 'r+') as f:
    for line in f:
        line = line.rstrip('\r\n')
        if line.endswith('.in'):
            print line
            newDomains.append(line)

顺便说一句,您通常应该注意所有文本文件中的行具有正确的行尾字符。

另外,list变量略显笨拙,而且不是很容易扩展。特别是对于大型文件,有意义的是尽快写出你发现的内容,而不是收集内存中的所有数据。

with open('newFishDomains.txt', 'r+') as c:
    with open ('fishDomains.txt', 'r+') as f:
        for line in f:
            line = line.rstrip('\r\n')
            if line.endswith('.in'):
                print line
                c.write(line + '\n')

最后,在shell中,这显然是一个单行:

grep '\.in$' fishDomains.txt >newFishDomains.txt

答案 1 :(得分:1)

在我的测试之后,我认为应该是导致问题的End of Line符号。在我的环境(win7)中,我打开一个测试文件显示如下(更具体地说,我还显示了EoL符号)

testline1.in\r\n
ttline2.in\r\n
line3.in

将您的代码应用于此文件,它只会显示[' line3.in']。因此,我建议您使用strip(),它会删除行尾符号( LF CRLF )并删除前导尾随空格。

我的修改后的代码如下:

with open ('fishDomains.txt', 'r+') as f:
    for line in f:
        line = line.strip()   # <====================
        print line
        if fnmatch(line, '*.in') is True:
            print line
            newDomains.append(line)

有一点需要注意的是, macOS系统使用 CR 作为EoL,哪种EoL会因strip而失败,但是&#39;十多年前,现在应该没有问题。