2013-03-04 97 views
1

我在Python v3.3中编写了一个程序,依次打开一个文件列表并使用每个文件中的数据执行操作。但是,由于某些原因,程序在打开文件时始终忽略列表中最后一个文件的最后一行。所有以前的文件都正常读取。这些文件本身具有相同的格式,列表中最后一个文件中没有其他空白或换行符不在所有其他文件中。python错误地跳过列表中最后一个文件的最后一行

的代码如下:

counter3=0 
for counter3 in range(counter3,numSteps): 
# open up each step in the list of steps across the chromosomal segment: 
    L=shlex.shlex(stepFileIndex[counter3],posix=True) 
    L.whitespace += '\t' 
    L.whitespace_split = True 
    L=list(L) 
    #print(L) 
    stepNumber = int(L[0]) 
    stepStart = int(L[1]) 
    stepStop = int(L[2]) 
    stepSize = int(stepStop-(stepStart-1)) 
#Now open the file of SNPs corresponding with the window in question and convert it into a list: 
    currentStepFile = open(("C:/Users/gwilymh/Desktop/Python/Sliding Window Analyses-2/%s_%s_step_%s.txt")%(str(segmentNumber),str(segmentName),str(counter3+1)),'r') 
    currentStepFile = list(currentStepFile) 
    nSNPsInCurrentStepFile = len(currentStepFile) 
    print("number of SNPs in this step is:", nSNPsInCurrentStepFile) 
    print(currentStepFile) 

最后两个列表中的文件如下:

1_segment1_step_7.txt 
['1503', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'C'] 
['1505', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'T', 'G'] 

1_segment1_step_8.txt 
['1950', 'G', 'G', 'G', 'C', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G'] 
['1967', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'G'] 
+1

其中是numSteps defiend? – Hoopdady 2013-03-04 20:44:32

+0

不应该有'currentStepFile.readlines()'在那里?我只看到一个文件句柄的列表... – 2013-03-04 20:44:42

+0

不,从技术上讲,这将工作。 – Hoopdady 2013-03-04 20:49:45

回答

0

是脚本运行时被写入的文件吗?

除了悬挂文件句柄,或许应该通过f.close()f.flush()清空缓冲区,我没有看到代码中的任何错误。

但是,您可以通过不使用list(filehandle)来改进代码,而是用for循环替换它。正如您可能注意到的评论,这不是一个常见的做法。

此外,因为您替换指向文件句柄currentStepFile的变量,您的代码将不得不等待垃圾回收才能关闭它。

如果您也在代码中的其他位置执行此操作,则可能是未来出现此问题或其他问题的原因。

+0

Hi Unode。澄清,w你的意思是'摇晃文件句柄'的帽子?你怀疑问题是由于使用列表而不是循环,还是因为我没有关闭文件句柄,或者两者兼而有之? – gwilymh 2013-03-04 21:37:53

+0

@gwilymh一个悬而未决的文件句柄是用'f = open(filename)'打开一个文件的结果,而不是用'f.close()'关闭它。由于Python会缓冲写入文件以避免在每个'f.write()'操作时触及磁盘,所以当您的其他代码部分尝试读取文件时,可能会发生文件不完整。 – Unode 2013-03-05 11:54:54

+0

谢谢你Unode。关闭所有打开的文件句柄似乎已经解决了这个问题。 – gwilymh 2013-03-06 17:05:22

相关问题