2009-06-22 48 views
2

我正在分阶段将文件写入磁盘。当我写它时,我需要知道我写的用于构建索引的行号。该文件现在有1200万行,因此我需要即时构建索引。我通过四个步骤来完成这项工作,其中包含四个我正在索引的值。基于我在其他地方发现的一些例子,我决定保持我的函数尽可能干净,我会在开始写入之前得到文件的行大小,以便我可以使用该数继续构建我的索引。如果我需要行数并且需要附加到文件,我可以避免处理文件两次吗?

所以我过这个问题跑,理论上所以我想获取当前的大小我想

myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','a') 
try: 
    num_lines=sum(1 for line in myFile) 
except IOError: 
    num_lines=0 

当我不知道,如果我加入了第一块或最后块到我的文件我这样做的结果是始终为0,即使MYFILE存在,并且有一个NUM_LINES> 0

如果我这样做,而不是:

myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt') 
try: 
    num_lines=sum(1 for line in myFile) 
except IOError: 
    num_lines=0 

我得到正确的值当且仅当MYFILE存在。 byt如果myFile不存在,如果我在第一个周期,我收到一条错误消息。

当我写出这个问题时,我发现在每个文件存在的情况下,值num_lines = 0的原因是因为文件正在被打开用于追加以便文件在最后一行打开并且现在正在等待线路交付。所以这解决了这个问题

try: 
    myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt') 
    num_lines=sum(1 for line in myFile) 

except IOError: 
    num_lines=0 

我的问题是这是否可以做另一种方式。我问的原因是因为我现在必须关闭myFile并重新打开它以便追加:

这就是我现在需要做的工作,我已经在文件中的数据的结束索引号有

myFile.close() 
myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','a') 

现在,这里是也许我学习something-因为我不得不打开该文件,然后也许两次获得起始索引(NUM_LINES)应该被移动到一个功能

def getNumbLines(myFileRef): 
    try: 
     myFile=open(myFileRef) 
     num_lines=sum(1 for line in myFile) 
     myFile.close() 
    except IOError: 
     num_lines=0 
    return num_lines 

如果我不必打开/处理文件两次,它会更干净。

基于埃里克温德林的答案,我可以这样做:

myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','a+') 
num_lines=sum(1 for line in myFile) 

感谢

+3

谷歌搜索一个更好的方法来计算在python线我达到了这个http://stackoverflow.com /问题/ 845058 /如何到获得-线计数便宜功能于蟒蛇。 – Macarse 2009-06-22 16:28:32

+0

我想知道这是否是计算行数的最佳方法,但是我认为我会与原始问题一起去避免将问题与另一个计数混淆。 – Erik 2009-06-22 16:31:16

+0

我的行计数解决方案是基于这个问题 – PyNEwbie 2009-06-22 16:45:08

回答

4

您可以打开一个文件进行读取和写入:

myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','r+') 

尝试。

更新:啊,我的错误,因为该文件可能不存在。使用'a +'而不是'r +'。

0

打开更新的文件( 'U' 或 'RW',我忘了)。现在你可以读取它直到EOF,然后开始写入追加。

0

我假设你正在写这个文件,那么你为什么不保持你已经写了多少行的单独轨道? 对我来说,看起来很浪费,你必须逐行阅读整个文件才能得到行号。

0

有点迟到了,但该文件存在的问题,为什么不使用(伪代码):

If FileExists(C:\NEWMASTERLIST\FULLLIST.txt') then 
begin 
    Open file etc 
    Calc numlines etc 
end 
else 
    Create new file etc 
    NumLines := 0; 
end;