好的,我已经努力了一段时间,但还是无法做到。
我正在制作一个接受文件名和模式的方法。
例如: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
运算符有点像作弊。看起来你的老师想让你手动实现一个子字符串搜索。 - aaronasterlingf.readlines()
。 - Matthew Flaschen