将文件打开到数组中,搜索字符串并返回值

时间:2010-10-08 21:51:18

标签: python arrays string file search

好吧,我已经有一段时间没有得到这个了。

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

e.g findPattern(fname,pat)

然后目标是查找该模式,在打开的文本文件中说出字符串“apple”,并通过[line,begin character index]返回它的位置 我是python的新手,并且被告知了许多方法,但它们要么太复杂,要么我们不允许使用它们,如索引;我们特别想使用数组。

我的想法是两个嵌套for循环,外部遍历textfile数组的每个索引,而内部for循环比较所需模式的第一个字母。如果找到,内部循环将被修改,所以现在它检查苹果中的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)

1 个答案:

答案 0 :(得分:1)

将文本数据导入数组的唯一方法是chars:

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中的含义非常不同):

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

这也是缓慢而且不那么pythonic,但比前一个选项模糊不清。如果其中任何一个真的是你被要求做的,你的老师可能不应该教Python。 :P