【问题标题】:Python; reading file and finding desired textPython;读取文件并找到所需的文本
【发布时间】:2011-04-18 02:03:30
【问题描述】:

需要创建一个带有两个参数的函数,一个要打开的文件名和一个模式。

模式将是一个搜索字符串。

例如。该函数将打开类似“The quick brown fox”(可能不止一行)的 sentence.txt

图案将是“棕狐”

因此,如果找到,它应该返回一个行号和找到的字符串开始的字符的索引。否则,返回 -1。

Catch 是我以前从未在 python 中编程,所以我不知道语法。 以前用 C、C#、Java、VB 等编写过代码。

编辑:

.....Id

.....名称

#

我的目的是让您编写 HW3 代码作为迭代或

显式索引字符的嵌套迭代

字符串作为数组;即 Python index() 也称为

此作业不允许使用string.index() 函数。

#

filename = raw_input('输入文件名:')

pattern = raw_input('输入模式:')

def findPattern(fname, pat):

一整块阅读

filetext = open(fname).read()
if pat in filetext:
    print("Found it -- chunk")
else:
    print("Nothing -- chunk")

逐行阅读

for search in open(fname):
    if pat in search:
        print("Found it -- line")
    else:
        print("Nothing -- line")    

findPattern(文件名,模式)

【问题讨论】:

  • 你应该安装linux并使用grep。
  • 或者在有能力的文本编辑器中使用在文件中查找选项。或者更好,两者都做!
  • 这是一个基于作业的问题,不是我需要做的事情,可以选择。 Linux + grep 我希望
  • 如果您展示您的代码并解释您遇到的问题会有所帮助。
  • 你有什么问题?您懒得看 1 个向您展示 Python 语法的文档?

标签: python file search


【解决方案1】:

你可以用“in”操作符模拟简单的“grep”

def grep(filename, pattern):
    for n,line in enumerate(open(filename)):
        if pattern in line:
             print line, n

要获取索引,可以使用str.index()str.find()

【讨论】:

  • 我必须进行分析才能确定,但​​我认为使用 inthen index 不会像使用 find 那样快并克服它。
  • 好吧,如果你使用 find(),它只会给你一个位置编号。它不会打印出找到模式的行。反正我已经提过这个函数只是模拟一个简单的grep。
  • 我需要在没有 grep 的情况下执行此操作。我刚刚浏览了有关正则表达式docs.python.org/library/re.html 的python 文档,但不确定我会使用什么。这就是我所在的位置,使用整块或逐行阅读文本。但是,通过行将阅读两者,并回答两者。所以它可以并且会在第一行发布一个“找到它”,然后发布一个“什么都没有”,因为它仍然会读取第二行。检查代码编辑
【解决方案2】:

这是一个非常简单的 grep。您可以破解它以非常简单地使用正则表达式。使用glob 进行通配不会变得更加困难。此外,您想要的代码在 grepmain 之间分布,因此这可能比自定义 grep 更有趣;)

def grep(filename, needle):
    with open(filename) as f_in:
        matches = ((i, line.find(needle), line) for i, line in enumerate(f_in))
        return [match for match in matches if match[0] != -1]

def main(filename, needle):
    matches = grep(filename, needle)
    if matches:
        print "{0} found on {1} lines in {2}".format(needle, len(matches), filename) 
        for line in matches:
            print "{0}:{1}:{2}".format(*line)
        return 1
    else:
        return -1

if __name__=='__main__':
    import sys
    filename = sys.argv[1]
    needle = sys.argv[2]
    return sys.exit(main(filename, needle))

请注意,我尚未测试此代码,因此可能存在一些小错误。如果它编译,它应该运行良好。

另外,你应该告诉你的老师,用返回码表示失败是一种可怕的做事方式。如果您要编写的函数的调用者需要知道是否没有找到匹配项,它可以只检查一个空列表。

【讨论】:

  • 啊,我只是不认识 with 关键字。我想我应该使用它......另外,很好的答案! +1
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多