简体   繁体   English

Python(3)readline返回空字符串,无论文件中有什么

[英]Python (3) readline returns empty string regardless of what is in the file

I have a Python (3) program that reads some data in from a file, gets the relevant parts and spits it out to various other places. 我有一个Python(3)程序,该程序从文件中读取一些数据,获取相关部分,然后将其吐到其他地方。 The problem is that file.readline() has started refusing to get any lines from any file. 问题在于file.readline()已开始拒绝从任何文件获取任何行。 It just returns an empty string as if it was at the end of the file. 它只是返回一个空字符串,就像它在文件末尾一样。 The files are not the problem, I checked that with a quick script (read file, print line by line). 文件不是问题,我使用快速脚本进行了检查(读取文件,逐行打印)。 The possible solution (although I don't know why) is I used 2to3 to convert the code to python3, but looking at the diff it printed I don't see any modifications to the file I/O stuff. 可能的解决方案(尽管我不知道为什么)是我使用2to3将代码转换为python3,但查看它打印的差异,我看不到对文件I / O的任何修改。

Here is the program: 这是程序:

import threading
import time

def runFile(eventFile, channelRefFileName, serialPorts, timeScale, maxPEs):
    timer0 = threading.Timer(.0001, turnOffLED, [0, 0, 0, 1])
    numEvents = getNumEvents(eventFile)
    eventCount = 0
    while 1:
        linein = eventFile.readline()
        #if linein == '' or '\n' or '\r\n' or '\r': break
        #above checks if the end of file has been reached, below is debugging
        if linein == '': print('EOF')
        if linein == '\n': print('linefeed')
        if linein == '\r\n': print('carrige return/ linefeed')
        if linein == '\r' : print('carrige return')
        if linein == 'New Event\n': 
            print('New Event', eventCount, ': file is', 
            (eventCount/numEvents)*100, '% done.')
            eventCount += 1
            #insert event sleep time here
            continue
         linein = linein.split(' ')
         del(linein[::2])
         linein[2] = linein[2][:-1]
         linein[1] = float(linein[1])
         if linein[1] < 0: linein[1] = linein[1] * (-1)
         channel = channelLookup(linein[0], channelRefFileName)
         #serialPorts[channel[0]].write(str(channel[1],linein[2]))
         if timer0.isAlive:
            #use backup timer
            timer1 = threading.Timer(0.005, turnOffLED, [serialPorts, channel[0], channel[1], 0])           
        timer1.start()
    else:
        #use primary timer
        timer0 = threading.Timer(0.005, turnOffLED, [serialPorts, channel[0], channel[1], 0])
        timer0.start()
    print('Sleeping:', linein[1]*timeScale)
    time.sleep(linein[1]*timeScale)

def channelLookup(channel, channelRefFile):
    channelRef = open(channelRefFile, 'r')
    for line in channelRef:
        if channel in line:
            linein = line
            break
    linein = linein.split('-')
    channelRef.close()
    return linein[1:]

def turnOffLED(serialPorts, arduino, pmt, bs):
    if bs: return -1
    #serialPorts[arduino].write(str(pmt,0))

def getNumEvents(eventFile):
    i = 0
    for lines in eventFile:
        if lines == 'New Event\n':
            i += 1
   return i

The above is run by: 上面是由:

import hawc
import datetime

timeScale = 0.001 
#timeScale of 0.000001 results in runtime of 0:06:52.858136
#a timeScale of 0.001 is 9:28:34.837992
eventSleep = 0
maxPEs = 1000
serialPorts = [0, 1, 2, 3, 4]
channelRefFileName = 'Data/hawc-arduino_channel_lookup'
st = datetime.datetime.now()
print('Start time is', st)

eventFile = open('Data/events.txt', 'r')
hawc.runFile(eventFile, channelRefFileName, serialPorts, timeScale, maxPEs)

eventFile.close()

et = datetime.datetime.now()
print('End time is', et)
print('File has run for', et-st)
print('--------Done---------')

And here is some sample data that the program might handle (one file might be about 500000 lines): 这是程序可能处理的一些示例数据(一个文件可能约500000行):

Channel: 447 Time: 121.263 PEs: 2263.38
Channel: 445 Time: 118.556 PEs: 1176.54
Channel: 448 Time: 120.384 PEs: 1159.59
Channel: 446 Time: 122.798 PEs: 983.949
Channel: 499 Time: 129.983 PEs: 762.07

getNumEvents consumes the entire file, so when you go around reading it, its pointer is already at the end. getNumEvents占用整个文件,因此当您四处阅读时,其指针已经在末尾。 Instead, reset the file pointer with seek , like this: 而是使用seek重置文件指针,如下所示:

def runFile(eventFile, channelRefFileName, serialPorts, timeScale, maxPEs):
    timer0 = threading.Timer(.0001, turnOffLED, [0, 0, 0, 1])
    numEvents = getNumEvents(eventFile)
    eventFile.seek(0, 0)
    eventCount = 0
    for linein in eventFile:
        if linein == '': print('EOF')
        ....

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM