python readline()返回多行

时间:2013-12-04 00:55:58

标签: python readline

我想我为自己制造了一个问题......

我有两个函数和一个全局文件描述符(文件对象)

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仍被调用时,文件正在重新打开。所以我看到了上面的行为。感谢您的所有建议!

1 个答案:

答案 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()