2016-11-12 5 views
1

Я пытаюсь добавить данные в файл. Каждая строка записывается внутри функции. Ниже приведен пример кода на основе моего фактического кода:Добавить данные в конец файла в python

a = 0 

def data(): 
    global a 
    a = int(raw_input('Enter value for a\n>')) 
    write() 

def write(): 
    f = open('path\\to\\file.txt', "a") 
    f.write('%s\n' % a) 
    f.close 
    proceed() 

def proceed(): 
    should = raw_input('Please press enter to continue or type in 0 to stop\n>') 
    if should == '0': 
     return 
    else: 
     data() 

data() 

Когда я запускаю код и дать, например, 1, 2 and 3 как значения для а, вот как это будет записано в файл:

3 
2 
1 

Но я хочу, чтобы записать в файл таким образом:

1 
2 
3 

что бы правильный способ сделать это? Как добавить новую строку в конце файла каждый раз, когда я запускаю функцию write?

+1

'f.close' не закрывает файл! и использование глобальных данных для передачи данных не рекомендуется. Используйте параметры. И, наконец, я действительно не понимаю, почему вы получаете этот результат. append mode не может вернуть порядок строк, это не имеет смысла. –

+0

@ Jean-FrançoisFabre Большое спасибо. Получил это, чтобы работать. – rsnaveen

+0

@ Jean-FrançoisFabre Вот что я тоже не понял. Даже если файл не был закрыт, не следует добавлять файлы всегда в конец файла? – rsnaveen

ответ

2

Ваша структура программы вызывает, возможно, очень глубокую рекурсию (проблему). Потому что в data() вы вызываете write(), а в write() вы вызываете continue(), а в continue() вы вызываете данные() снова. Старайтесь избегать такого рода структуры. Следующий код позволяет избежать этой проблемы, и короче:

def data(): 
    while True: 
     a = int(raw_input('Enter value for a\n>')) 
     f.write(str(a) + '\n') 

     should = raw_input('Please press enter to continue or type in 0 to stop\n>') 
     if should == 0: 
      break 


f = open('path\\to\\file.txt', "a") 
data() 
f.close() 
+0

Пример кода, который я предоставил, - это просто показать структуру моего фактического кода. Для получения ввода и записи его в файл ваш код работает превосходно. Но в моем исходном коде у меня есть довольно много функций, и для каждой последовательной функции для правильной работы предыдущий должен работать без какой-либо ошибки. Вот почему я структурировал свой код таким образом. Однако, можете ли вы объяснить, почему добавление ведет себя так, как это происходит, когда файл не был закрыт должным образом? Спасибо. – rsnaveen

+0

Структура вашего реального кода приводит к возможным ошибкам рекурсии. Это означает, что вы можете вызывать данные() только так много раз, прежде чем интерпретатор будет вызывать ошибку, поскольку она вызывает функцию, вызывающую funtion, которая снова вызывает данные(). Вызовы в этой цепочке должны отслеживаться интерпретатором, и для этого достаточно места для хранения. Итак, наконец, у вас закончится пространство стека - добро пожаловать в Stackoverflow :) Я не знаю, почему значения записываются сверху вниз, когда вы не закрываете свой файл должным образом. Полагаю, что это может быть файловый буфер, который не сбрасывается перед оператором close(). – Ukimiku

+0

Большое спасибо @Ukimiku. Я попытаюсь перестроить свою программу, чтобы избежать ошибок рекурсии :) – rsnaveen

1

надлежащим образом реализовать свои требования было дано @Ukimiku. Что касается того, почему ваш код ведет себя так, мое мнение здесь. Фактически, откройте файл с open('path','a'), чтобы переместить указатель файла в конец открытого файла, чтобы при использовании write() вы добавили что-то.

f = open('path\\to\\file.txt', "a") 
print f.tell() #get the position of current file pointer 
f.write('%s\n' % a) 

Добавить print f.tell() после открытия file.txt. Вы найдете каждый раз, когда вы его открываете, позиция указателя всегда равна 0, что указывает на то, что ваша операция write() вставляет эти числа в начале этого файла. Это произошло из-за отсутствия закрытия. Эти изменения происходят в памяти и еще не записаны на диск.

+0

Большое спасибо за объяснение этого :) – rsnaveen

Смежные вопросы