从fi打印行时获取意外换行符

2024-10-04 01:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有一个非常直截了当的问题…我希望将正则表达式匹配附加到同一行,而不是文件中的新行。我以为我做得对,但结果仍然是打印到一个新的行:

结果:

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

我想要的:

^{pr2}$

当前代码:

#!/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()

我错过了什么?在


Tags: 文件代码importrehomestdoutsysline
3条回答

从行中删除换行符:

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

您也可以/可能只使用切片,但这将取决于行尾是否有新行:

^{pr2}$

我不会这样做,因为你必须确切地知道每个文件是如何格式化的,如果在任何时候有任何错误,你可能会有一个很难找到的bug。在

还有一些不太像python的东西,尽管它们更适合代码评审。
既然评论太长了,我就把它当作一个答案。在

小结:

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

  • 不要使用file作为变量名:这是一个保留的类名(对于文件对象,同样如此)

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

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

    这个迭代也可以节省内存,因为它不会一次性读取完整的文件,而是一行一行地读取。有关详细信息,请参见示例this post

  • 简单的单词搜索不需要正则表达式。一般来说,首先尝试避免使用regex,然后看看还有什么其他选项(有很多有用的方法可以str)。在

    关于regex的通常说法是

    I have a problem. I'll try a regular expression.

    ...

    Now I have two problems

    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语句中组合文件:

^{pr2}$


该文件包含附加新行的字符串。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()

相关问题 更多 >