我对Python是新手,在C++编程方面经验很少。我看到了this问题,但它没有解决我的问题。在
Python 2.7.9, 64-bit AMD, Windows 7 Ultimate, NTFS, administrator privileges & no "read only" attribute on file to be read.
我想创建一个满足特定条件的字符串列表,这些字符串是文件的行(请参见记事本.cc/diniko93)。所以我写了以下函数-
def makeLineList( filePtr, ptr ):
lines = []
while True:
s = filePtr.readline()
if not s=="":
s = s[3:]
s = s.split()
if s[0].isdigit():
print("O")
lines.append(s)
elif s[0] in {"+", "-"}:
print("U")
lines.append(s)
else:
print("none")
break
filePtr.seek(ptr, 0); #I did this to restore file pointer, so other functions accessing this file later don't misbehave
return lines
我使用的两个可能的main()类(请原谅我对python一无所知)实体是-
^{pr2}$另一个-
osrc = open("./testStage1.txt", 'r')
osrc.seek(291, 0)
L = makeLineList( osrc, osrc.tell())
print "".join(L)
osrc.close()
两次终端上的输出都是令人失望的none
请注意以上代码是重现问题所需的最低要求,而不是整个代码。在
编辑:
根据@avenet的建议,我在google上尝试在代码中使用iter(__next__
obj.next()
在python3.3+中使用next(obj)
),但问题仍然存在,即使我从函数内部调用next(osrc)
,我也无法读取下一行代码检查这两个片段
编辑2:我尝试在函数中使用scope check作为if not osrc in locals():
在下一行中使用适当的缩进print("osrc not reachable")
。输出是osrc not reachable
。我还尝试使用临时tLib.py公司但结果是一样的。为什么osrc在这两种情况下都不可用?在
编辑3:因为问题似乎在范围之内。 因此,为了避免传递文件变量-创建一个唯一的目的是读取一行的函数。是否下一行的决定取决于isLineUtility()等函数的返回值
def isLineUseful( text, lookFor ):
if text.find(lookFor)!=-1:
return 1
else:
return 0
def makeList( pos, lookFor ):
lines = []
with open("./testStage1.txt", 'r') as src:
src.seek(pos)
print(src.read(1))
while True:
line = next(src)
again = isLineUseful(line, lookFor)
if again==0:
src.seek(pos)
break
else:
lines.append(line)
return lines
t = makeList(84, "+")
print "\n".join(t)
试过了,在这个上面效果很好(记事本.cc/diniko93)示例testStage1.txt。在
因此,我的编程问题得到了解决(感谢responders:D)&;我将此标记为已回答,但发布了一个关于readline()
&;__next__
的异常/行为的新问题。在
另外,我还在学习python的方法,所以如果您能推荐一个更适合我上面代码的pythonic和idomatic版本,我将非常高兴。在
您尝试处理此输入:
现在在你的大脑里,你只看到重要的部分,而Python看到了所有的东西。对于Python(和任何其他编程语言),每行都以
<
开头。这就是if
永远不匹配的原因。在如果删除了
^{pr2}$<P>
,请确保也删除了空格,因为第二行以空格开头,因此}。要去除空格,请使用
s[0]
不是{s.trim()
。在如果要按自己的方式修改线条:
如果不想变换线条,请执行以下操作:
^{pr2}$或者,如果需要在特定条件下停止,则只需实现一个行迭代器:
首先,您并没有使用Python。使用Python这样的语言的目的是编写更少的代码行,以实现其他编程语言中的其他代码片段的相同结果,例如C++或java。在
不需要将文件指针作为函数参数传递来读取文件,您可以在传递文件名的函数中直接打开文件。在
然后可以用文件名调用这个函数,并将列表存储在一个最终将要操作的变量中。如果您不熟悉异常处理,可以使用模块
os
中的一个函数来检查文件是否已经存在:os.path.exists(filename)
。在如果要在当前使用的行中搜索模式,只需使用If语句即可(有很多方法可以这样做,这只是一个示例):
如果要检查模式是否在开头,可以使用
^{pr2}$startswith
字符串函数:如果您想跳过一定数量的字符,可以使用
seek
函数(正如您实际使用的那样)。这只是一种使用更多代码行的方法,但仍然非常简单:更简单的是,您也可以这样做,而不是显式地遍历所有行:
或者使用您最喜欢的函数
readlines
:显式迭代所有行的目的和好处是,您可以在阅读的正确时刻对行或字符进行大量检查和任何需要的检查,所以我肯定会采用上面建议的第一个选项。在
相关问题 更多 >
编程相关推荐