我正在分阶段将文件写入磁盘。当我写它的时候,我需要知道我正在写的用来建立索引的行号。文件现在有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\u lines>;0
如果我改为这样做:
^{pr2}$如果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.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
如果我不必打开/处理文件两次,那会更干净。在
根据埃里克·温德林的回答,我可以:
myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','a+')
num_lines=sum(1 for line in myFile)
谢谢
您可以打开文件进行读写:
试试看。在
更新:啊,我的错误,因为文件可能不存在。使用“a+”而不是“r+”。
我假设你正在写这个文件,那么为什么不单独记录你已经写了多少行呢? 在我看来,为了得到行号而不得不逐行阅读整个文件,这看起来非常浪费。在
打开文件进行更新(“u”或“rw”,我忘了)。现在您可以一直读到EOF,然后开始写append。在
相关问题 更多 >
编程相关推荐