我遇到了一个我正在努力解决的奇怪问题。当我通过.txt文件运行re.findall()
,然后尝试打印并写入结果。我期望看到的所有结果,但它们以不同的格式表达。
代码(从我之前发现的类似线程修改):
import re
with open ('test.txt') as text:
text = text.read()
match = re.findall(r'[\w\.-]+@[\w\.-]+', text)
for i in match:
with open ('list.txt', 'a') as dest:
i = str(i)
print(i)
dest.write(i)
然后解释器产生结果:
a@a
b@b
c@c
这正是我期望它做的,给出test.txt的内容。 但是,list.txt读取:
(generic existing text goes here)
a@ab@bc@c
虽然我希望它(并且相信它应该)阅读
(generic existing text goes here)
a@a
b@b
c@c
我尝试使用str.writelines.()
代替str.write()
,但这没有用。 print()
和str.write()
之间的差异导致了这种模糊性,以及如何避免它。
N.B。我99%肯定第8行i = str(i)
没有任何意义,但我已将其留在原因,因为这是我一直在做的事情。不确定为什么......
答案 0 :(得分:1)
我将从你的上一条评论开始。 str(i)
的作用是将i
转换为其字符串表示形式(在i
的类__str__
方法中定义)。例如,如果您致电str(4)
,则会获得'4'
。在这种情况下,这是不必要的,因为re.findall
会返回字符串列表as per the documentation。
至于你的实际问题:你错过了换行符。我也希望打开文件的次数比你少。
也许试试:
import re
with open ('test.txt') as text:
text = text.read()
match = re.findall(r'[\w\.-]+@[\w\.-]+', text)
with open('list.txt', 'a') as dest:
for i in match:
print(i)
dest.write(i + '\n')
(如果您不想在每次写入时都想在控制台中看到输出,也可以删除print(i)
行。)