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

Python 将文件打开到数组中,搜索字符串并返回值,python,arrays,string,file,search,Python,Arrays,String,File,Search,好吧,我已经做了一段时间了,但是我没法得到它 我正在创建一个接受文件名和模式的方法 例如findPattern(fname,pat) 然后,目标是寻找该模式,在打开的文本文件中说字符串“apple”,并通过[line,start character index]返回其位置 我是python新手,有人告诉我很多方法,但它们要么太复杂,要么我们不允许使用它们,比如索引;我们应该特别使用数组 我的想法是两个嵌套的for循环,外部遍历textfile数组的每个索引,内部for循环比较所需模式的第一个字母

好吧,我已经做了一段时间了,但是我没法得到它

我正在创建一个接受文件名和模式的方法

例如findPattern(fname,pat)

然后,目标是寻找该模式,在打开的文本文件中说字符串“apple”,并通过[line,start character index]返回其位置 我是python新手,有人告诉我很多方法,但它们要么太复杂,要么我们不允许使用它们,比如索引;我们应该特别使用数组

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

一个主要问题是我无法将文件放入数组中,我只能执行整行操作

我有些东西,虽然不太管用。我只是在试验。告诉我它在哪里,但它总是在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

将文本数据放入数组的唯一方法是作为字符:

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
然而,这是非常不符合pythonic的,而且速度非常缓慢

如果数组指的是列表(这两个术语在Python中的含义截然不同):


这也是一种缓慢的、非pythonic的方式,但与前一种方式相比,效果稍差一些。如果这些都是你被要求做的,你的老师可能不应该教Pythonp

您所拥有的可能也不会被允许,因为中的
操作符有点作弊。看起来您的老师希望您手动执行子字符串搜索。要在Python 2.x中将文件读入列表(而不是数组),请使用
f.readlines()
。我是否需要以某种方式声明数组?实际上,您需要导入它。这是一个模块。:)与c语言中的导入非常相似?看起来只是“导入数组”?愚蠢的问题,完美。我喜欢我们不必处理换行符,因为如果我在第一行输入最后一个单词,而在第二行输入第一个单词,它不应该找到它,也不是因为换行符。另外,我现在可以用它作为计数,看看我在哪条线上,对吗?让我们看看我怎样才能在这方面工作。我能看到的唯一问题是,我们的角色计数一直在进行,不必担心哪一行。我认为我需要从每行0开始。假设你使用第一个版本,我确实是文件中的“绝对位置”,而不是每行内的偏移量。如果希望以行和列的形式显示位置,而不是文件中的绝对位置,则需要再保留两个计数器(行和列),每次a[i]='\n'时,都会增加行并重置列。
for i in xrange(len(a)):
   if ''.join(a[i:i+len(substring)]) == substring:
      print 'Found @ %d!' % i
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