Я записываю файл на диск поэтапно. Когда я пишу это, мне нужно знать номера строк, которые я пишу, чтобы использовать для построения индекса. Файл теперь содержит 12 миллионов строк, поэтому мне нужно построить индекс на лету. Я делаю это в четыре этапа, с четырьмя группировками значения, на которое я индексирую. Основываясь на некоторых примерах, которые я нашел в других местах на SO, я решил, что для обеспечения максимальной чистоты моих функций я получу размер строки файла до того, как начну писать, чтобы я мог использовать это количество для продолжения построения моего индекса.
Итак, я столкнулся с этой проблемой, теоретически я не знаю, добавляю ли я первый или последний кусок в свой файл, поэтому я подумал, что для получения текущего размера я бы
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 существует. байт, если 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
Было бы чище, если бы мне не приходилось открывать / обрабатывать файл дважды.
Основываясь на ответе Эрика Венделина, я могу просто сделать:
myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','a+')
num_lines=sum(1 for line in myFile)
Спасибо