Skip to main content
 首页 » 编程设计

python之如果我需要行数并且需要附加到文件,我可以避免处理文件两次吗

2024年08月12日37haluo1

我正在分阶段将文件写入磁盘。在我编写它时,我需要知道我正在编写的行号以用于构建索引。该文件现在有 1200 万行,因此我需要即时构建索引。我分四个步骤执行此操作,其中有四组我正在编制索引的值。基于我在 SO 上其他地方找到的一些例子,我决定为了尽可能保持我的函数干净,我会在开始编写之前获取文件的行大小,这样我就可以使用该计数继续构建我的索引。

所以我遇到了这个问题,理论上我不知道我是将第一个 block 还是最后一个 block 添加到我的文件中,所以我想获得我想要的当前大小

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') 

现在,这就是我可能正在学习的地方 - 考虑到我必须打开文件两次,然后也许应该将获取起始索引 (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 

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

根据 Eric Wendelin 的回答,我可以这样做:

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

谢谢

请您参考如下方法:

您可以打开文件进行读写:

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

试试吧。

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