从文件中打印行时获取意外的换行符

时间:2016-01-11 20:51:39

标签: python regex append line

这里非常直截了当的问题......我希望将我的正则表达式匹配添加到同一行,而不是文件中的新行。我以为我已经正确地完成了这项工作,但结果仍然是打印到新的一行:

结果:

1,2,BreakingBad,4,5,6...
,BreakingBad

我想要的是什么:

1,2,BreakingBad,4,5,6...,.BreakingBad

当前代码:

#!/usr/bin/env python
import re
import sys

file = open("/home/test", "r")
newfile = open("/home/testresults","w")

def regex():
        #old_stdout = sys.stdout
        #sys.stdout = newfile
        lines = file.readlines()
        for line in lines:
                regex = re.search(r'(BreakingBad)',line)
                if regex:
                        print line + "," + regex.group(1)

try:
        regex()
finally:
        file.close()

我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

还有一些不过于Pythonic的东西,尽管它们更适合代码审查。
由于评论会变得太长,我只是把它作为答案。

要点:

  • 使用with上下文管理器。这为您节省了try ... finally的麻烦,以确保文件在之后关闭。

  • 不要将file用作变量名称:它是一个保留的类名(对于文件对象,不能少)

  • 不要使用全局变量:只需将文件名传递给regex()函数

  • 迭代文件对象。这样可以节省对readlines()的调用,然后迭代这些行。迭代文件可以一次完成同样的事情。

    此迭代还可以节省内存,因为它不会一次读取整个文件,而是逐行读取。有关详细信息,请参阅this post

  • 您不需要正则表达式来进行简单的单词搜索。通常,首先尝试避免使用正则表达式并查看存在的其他选项(str有很多有用的方法)。

    关于正则表达式的通常说法类似于

      
        
          

    我有问题。我会尝试正则表达式。

                 

    ...

                 

    现在我有两个问题

        
      

    here's one post on this topic。)

    在这种情况下,一个简单的if word in sentence形式可以解决问题。

这可以提供以下代码:

#!/usr/bin/env python
import sys

def run(filename):
    with open(filename) as infile:  # "r" mode is default
        for line in lines:
            if 'BreakingBad' in line:
                print line.rstrip('\n') + "," + 'BreakingBad'

run("/home/test")

请注意,我明确地rstrip ping换行符:如果您只使用rstrip(),则会从右侧删除任何空格字符,包括空格和制表符。这可能是有意的,但问题并不清楚。

此外:由于你打开一个文件进行写作(但不要使用它,也就是说,它对你的问题不重要):你可以在with语句中组合文件:

with open(filename) as infile, open(newfilename, "w") as outfile:
    <whatever>

答案 1 :(得分:1)


该文件包含附加了换行符的字符串。 Python将其读作:
lines = '1,2,BreakingBad,4,5,6...\n'

因此当你连接时,字符串是:
1,2,BreakingBad,4,5,6...\n,BreakingBad

你真正想要的是删除换行符:

#!/usr/bin/env python
import re
import sys


file = open("/home/test", "r")
newfile = open("/home/testresults","w")

def regex():
        #old_stdout = sys.stdout
        #sys.stdout = newfile
        lines = file.readlines()
        for line in lines:
                regex = re.search(r'(BreakingBad)',line)
                if regex:
                        print line.strip() + "," + regex.group(1)

try:
        regex()
finally:
        file.close()

答案 2 :(得分:0)

从行中删除换行符:

print line.rstrip() + "," + regex.group(1)

您可能/也可能只使用切片,但这取决于行末尾是否有换行符:

print line[:-1] + "," + regex.group(1) #if ends with '\n'

我不会这样做,因为你必须完全知道每个文件是如何格式化的,如果在任何时候出现任何错误,你可能很难找到错误。