Могу ли я избежать обработки файла дважды, если мне нужно количество строк и мне нужно добавить файл? - PullRequest
2 голосов
/ 22 июня 2009

Я записываю файл на диск поэтапно. Когда я пишу это, мне нужно знать номера строк, которые я пишу, чтобы использовать для построения индекса. Файл теперь содержит 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)

Спасибо

Ответы [ 4 ]

4 голосов
/ 22 июня 2009

Вы можете открыть файл для чтения И записи:

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

Попробуйте это.

ОБНОВЛЕНИЕ: Ах, моя ошибка, поскольку файл может не существовать. Используйте «a +» вместо «r +».

0 голосов
/ 23 июня 2009

Немного опоздал на вечеринку, но для файла существует проблема, почему бы не использовать (Psuedocode):

If FileExists(C:\NEWMASTERLIST\FULLLIST.txt') then
begin
  Open file etc 
  Calc numlines etc
end
else
  Create new file etc
  NumLines := 0;
end;
0 голосов
/ 22 июня 2009

Я предполагаю, что вы пишете файл, в таком случае, почему бы вам не сохранить отдельный трек, сколько строк вы уже написали? для меня это выглядит очень расточительно, что вы должны читать весь файл построчно, чтобы получить номер строки.

0 голосов
/ 22 июня 2009

Откройте файл для обновлений (я забыл 'u' или 'rw'). Теперь вы можете прочитать его до EOF, а затем начать писать, чтобы добавить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...