打开文件并将其转换为数组,搜索字符串并返回值。

3

好的,我已经努力了一段时间,但还是无法做到。

我正在制作一个接受文件名和模式的方法。

例如:findPattern(fname, pat)

然后目标是在打开的文本文件中查找该模式,比如字符串“apple”,并返回其位置,即[行,开始字符索引]

我是Python新手,已经被告知很多种方法,但它们要么太复杂,要么不允许使用它们,比如index; 我们特别应该使用数组。

我的想法是两个嵌套的for循环,外部循环遍历文本文件数组的每个索引,内部循环比较所需模式的第一个字母。如果找到,则内部循环将增加,现在正在检查apple与文本文件的p。

一个主要的问题是我无法将文件转换为数组,我只能做整行。

这是一些我写的代码,虽然不完全正确。我只是试验.tell来显示它在哪里,但它始终在141处,我相信这是EOF,但我没有检查过。

#.....Id #
#.....Name

#########################
#my intent was for you to write HW3 code as iteration or
#nested iterations that explicitly index the character 
#string as an array; i.e, the Python index() also known as 
#string.index() function is not allowed for this homework.
########################

print
fname = raw_input('Enter filename: ')
pattern = raw_input('Enter pattern: ')

def findPattern(fname, pat):

    f = open(fname, "r")
    for line in f:
        if pat in line:
            print "Found it @ " +(str( f.tell()))
            break
    else:
        print "No esta..."    

print findPattern(fname, pattern)

编辑:

fname = raw_input('Enter filename: ')
pattern = raw_input('Enter pattern: ')

def findPattern(fname, pat):

    arr = array.array('c', open(fname, 'rb').read())

    for i in xrange(len(arr)):
        if ''.join(arr[i:i+len(pat)]) == pat:
            print 'Found @ %d' % i    

print

findPattern(fname, pattern)

从上面替换的新代码中,我得到了下面的内容。我知道这可能是因为数组没有被声明,但我不确定Python语法是否需要声明数组大小?

lynx:desktop $ python hw3.py

Enter filename: declaration.txt
Enter pattern: become

Traceback (most recent call last):
  File "hw3.py", line 25, in <module>
    findPattern(fname, pattern)
  File "hw3.py", line 17, in findPattern
    arr = array.array('c', open(fname, 'rb').read())
NameError: global name 'array' is not defined

编辑: 完成了!谢谢大家。 这是我如何巧妙地解决它的方法。

#Iterate through
for i in xrange(len(arr)):

    #Check for endline to increment linePos
    if arr[i] == '\n':
        linePos = linePos + 1
        colPos = i

    #Compare a chunk of array the same size
    #as pat with pat itself
    if ''.join(arr[i:i+len(pat)]) == pat:

        #Account for newline with absolute position
        resultPos = i - colPos
        print 'Found @ %d on line %d' % (resultPos, linePos)

你那里的代码可能不被允许,因为 in 运算符有点像作弊。看起来你的老师想让你手动实现一个子字符串搜索。 - aaronasterling
在Python 2.x中将文件读入列表(不是数组),请使用f.readlines() - Matthew Flaschen
1个回答

1

将文本数据转换为数组的唯一方法是将其作为字符存储:

a = array.array('c', open(filename, 'rb').read())

从那里开始,您可以简单地迭代它并将与您的子字符串长度相同的每个子数组转换为字符串以进行比较:

for i in xrange(len(a)):
   if ''.join(a[i:i+len(substring)]) == substring:
      print 'Found @ %d!' % i

这种方式非常不符合Python的风格,而且速度极慢

如果你所说的数组是指列表(在Python中这两个术语有非常不同的含义):

pos = 0
for line in open(filename):
    for i in xrange(len(line)):
        if line[i:i+len(substring)] == substring:
           print 'Found @ %d!' % (pos + i)
    pos += len(line) + 2 # 1 if on Linux

这种方法也很慢,不太符合Python的风格,但比之前的选项略好一些。如果你的老师让你做这些事情中的任何一个,那么他可能不应该教授Python。:p


我需要以某种方式声明数组吗? - John Redyns
你需要导入它,实际上这是一个模块。 :) - Vlad
与C语言中的#import <std.io>类似吗? 好像只需要“import array”? - John Redyns
愚蠢的问题,太好了。我喜欢我们不必处理换行符,因为如果我在第一行输入最后一个单词和第二行的第一个单词,它不应该找到它,由于那个换行符\n字符,它确实没有找到。此外,我现在可以将其用作计数器以查看我在哪一行,对吧?让我们看看我如何将其运用。我唯一能看到的问题是,我们拥有的字符计数会继续增加,而不考虑所在的行。我认为我需要从0开始重新计算每一行的字符数。 - John Redyns
用Python的方式来完成这个任务,应该怎么做呢? - DaClown
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接