我想我为自己制造了一个问题......
我有两个函数和一个全局文件描述符(文件对象)
def fileController():
global fd
fName = ui.fileEdit.text()
if ui.lineByLine.isChecked:
ui.fileControl.setText('Next Line')
ui.fileControl.clicked.connect(nextLine)
fd = open(fName, 'r')
def nextLine():
global fd
lineText = fd.readline()
print lineText
def main():
app = QtGui.QApplication(sys.argv)
global ui
ui = uiClass()
ui.fileControl.clicked.connect(fileController)
ui.lineByLine.stateChanged.connect(lineByLineChange)
sys.exit(app.exec_())
if __name__ == '__main__':
main()
当调用nextLine()时,它返回第一行 如果再次调用则返回第一行和第二行 如果再次调用它则返回第一行,第二行和第三行。 等等。
文件描述符可能是一个全局变量吗?
可以找到完整的未编辑代码here
所有帮助表示赞赏!
编辑:包含更多上下文代码 EDIT2:添加了到github项目文件的链接
解决: 问题是:
ui.fileControl.clicked.connect(nextLine)
不会断开先前的信号。因此,每次单击文件Control()时,都会添加“信号和插槽”,以便多次调用newLine()。当fileController仍被调用时,文件正在重新打开。所以我看到了上面的行为。感谢您的所有建议!
答案 0 :(得分:1)
您可以编写一个类来封装此类操作:
class MyFile(object):
def __init__(self, filename=''):
self.fp = open(filename, 'rb')
self.state = 0 # record the times of 'nextline()' called
self.total = self.lines_num()
def lines_num(self):
"""Calculate the total lines of the file"""
count = 0
abuffer = bytearray(2048)
while self.fp.readinto(abuffer) > 0:
count += abuffer.count('\n')
self.fp.seek(0)
return count
def nextline(self):
"""Returning -1 means that you have reached the end of the file
"""
self.state += 1
lines = ''
if self.state <= self.total+1:
for i in xrange(self.state):
lines = '%s%s' % (lines, self.fp.readline())
else:
return -1
self.fp.seek(0)
return lines
>>> test = MyFile('text.txt')
>>> test.nextline()