将单个多线性字符串写入.txt中的多行

时间:2016-07-05 04:44:08

标签: python regex

我遇到了一个我正在努力解决的奇怪问题。当我通过.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)没有任何意义,但我已将其留在原因,因为这是我一直在做的事情。不确定为什么......

1 个答案:

答案 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)行。)