【发布时间】:2014-12-30 13:42:45
【问题描述】:
我是 Python 新手;很少有C++编程经验。我看到了this 的问题,但它并没有解决我的问题。
Python 2.7.9、64 位 AMD、Windows 7 Ultimate、NTFS、管理员权限和要读取的文件没有“只读”属性。
我想创建一个满足特定条件的字符串列表,这些字符串是文件的行(参见 notepad.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 的无知)是-
with open("./testStage1.txt", 'r') as osrc:
osrc.seek(291, 0)
L = makeLineList( osrc, osrc.tell())
print "".join(L)
还有一个——
osrc = open("./testStage1.txt", 'r')
osrc.seek(291, 0)
L = makeLineList( osrc, osrc.tell())
print "".join(L)
osrc.close()
两次终端上的输出都是令人失望的none
请注意上面的代码是重现问题的最低要求,而不是整个代码。
编辑:
根据@avenet 的建议,我用谷歌搜索并尝试在我的代码中使用 iter(__next__obj.next() 在 python 3.3+ 或 next(obj) 在 2.7),但问题仍然存在,即使我打电话也无法阅读下一行next(osrc) 从函数内部检查这 2 个 sn-ps
- version2 next 仅用于 main()-ish 部分 transform_line 函数未被调用。调用 next() 3 次会产生理想/预期的输出但在
- version3 我得到一个 list index out of range 错误,即使是 list[0] 肯定有一个数字
编辑 2: 我在我的函数中尝试了 scope check 作为 if not osrc in locals(): 并在下一行中使用了适当的缩进 print("osrc not reachable")。输出为osrc not reachable。我还尝试使用临时 tLib.py 中的from tLib import transform_line,但结果相同。为什么两种情况下 osrc 都不可用?
编辑 3: 因为问题似乎是范围。 因此,为了避免传递文件变量 - 创建一个函数,其唯一目的是读取一行。是否获取下一行的决定取决于 isLineUseful() 等函数的返回值
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)
试过了,它在这个(notepad.cc/diniko93)样本testStage1.txt上完美运行。
所以我的编程问题得到了解决(感谢响应者:D),我将其标记为已回答,但发布了一个关于 readline() 和 __next__ 的异常/行为的新问题。
附:我还在学习 python 的方法,所以如果你能建议我上面代码的更多 pythonic 和 idomatic 版本,我会很高兴。
【问题讨论】:
-
另外,在 Python 中,您不需要分号来结束语句,除非您想将两条语句放在一行中,而且您几乎不想这样做。
-
那么显而易见的情况如何:文件中没有行以数字或
+或-开头,而none是由readline()在EOF 上返回空字符串引起的? -
else部分是否不匹配? -
notepad.cc 页面似乎是空白的。
-
所有行都以“
”开头。 “strip,对吧?你确定你用对了吗?请记住,如果您不分配结果,则仅调用 strip 不会执行任何操作。
s.strip("<P>")没有效果,你必须做s = s.strip("<P>")。