我正在使用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")
答案 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;十多年前,现在应该没有问题。