Почему новый объект NamedTemporaryFile имеет путь, но файл недоступен?

Я провожу 30-дневный курс Python на Udemy. В День 16, часть 2, я застрял с созданием функции edit_data (в моем коде: edytuj_dane). Я хотел бы сохранить некоторые значения во временном файле (объект NamedTemporaryFile) с помощью DictWriter, а затем переместить содержимое в файл CSV (dane.csv), который должен обновляться каждой командой функции.

Я запутался, так как есть ошибка, что я не могу получить доступ к временному файлу, созданному объектом NamedTemporaryFile, тогда как при проверке пути кажется, что он вообще недоступен (также проверял, скрыт ли он). Не могли бы вы проверить и сообщить мне, если у вас есть какие-либо идеи, как исправить ошибку?

Содержимое файла dane.csv выглядит следующим образом:

идентификатор, имя, электронная почта, сумма, отправлено, дата

1,2,3,4,5,6

И исполняемый код ниже:

def edycja_danych(edit_id = None, email = None, sent = None, amount = None):
    nazwa_pliku = 'data.csv'
    plik_tymczasowy = NamedTemporaryFile(delete=True, mode ='w') 

    with open(nazwa_pliku, 'r') as csvfile, plik_tymczasowy:
        reader = csv.DictReader(csvfile)
        tytuly = ['id','name','email', 'amount', 'sent', 'date']
        writer = csv.DictWriter(plik_tymczasowy, fieldnames = tytuly)
    
        writer.writeheader() 
        
        for row in reader:
            writer.writerow(row)
            shutil.copyfile(plik_tymczasowy.name, nazwa_pliku)

edycja_danych(email='[email protected]', amount = 90, sent = '')

На самом деле выполнение кода заканчивается следующей ошибкой:

PermissionError: [Errno 13] Отказано в доступе: 'C:\Users\Marek\AppData\Local\Temp\tmpjr622sbn'

Принимая во внимание, что это должно (по крайней мере, я так думаю) закончиться без ошибок и с обновлением файла.


person markoo    schedule 02.04.2019    source источник
comment
это и проблемы с отступом, из-за которых файл выходит за рамки блока with и в конечном итоге удаляется.   -  person Jean-François Fabre    schedule 02.04.2019
comment
не используйте для этого временный файл (если данные не большие). Используйте io.StringIO, чтобы создать поддельный файл для передачи в csv.   -  person Jean-François Fabre    schedule 02.04.2019
comment
@Jean-FrançoisFabre Нет ничего плохого в использовании здесь NamedTemporaryFile, по крайней мере, при условии, что вы используете os.rename вместо shutil.copyfile для создания целевого файла атомарно.   -  person chepner    schedule 02.04.2019
comment
Похоже, вы пытаетесь скопировать свой временный файл во входной файл, и вы пытаетесь сделать это после записи каждой строки, а не после завершения всех операций записи.   -  person chepner    schedule 02.04.2019
comment
@chepner лучше переименовать, но это работает, только если вы находитесь в той же файловой системе. shutil.move предпочтительнее в общем случае   -  person Jean-François Fabre    schedule 02.04.2019
comment
это дубликат, потому что вы пытаетесь получить доступ к файлу, когда он еще не закрыт.   -  person Jean-François Fabre    schedule 02.04.2019