我正在分阶段将文件写入磁盘。在我编写它时,我需要知道我正在编写的行号以用于构建索引。该文件现在有 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+”。
