Как я могу гарантировать, что кадр данных был завершен при записи с помощью pandas.to_csv()?

#python #pandas #temporary-files

Вопрос:

Я создал небольшой скрипт, который запрашивает базу данных и возвращает результат. Затем я использовал Pandas.to_csv (), чтобы записать его во временный файл CSV, прежде чем загружать этот результат CSV в облачное хранилище. Проблема, с которой я сталкиваюсь, заключается в том, что функция pandas.to_csv() завершила запись временного файла CSV, прежде чем я загружу его в облачное хранилище. Единственный способ, которым я последовательно гарантировал, что эта дата попадет во временный файл до загрузки, — это сохранить

печать(temp.tell())

строка кода в приведенном ниже примере. Если я это прокомментирую, данные не будут загружены.

Пример кода ниже:

 def write_to_temporary_csv_file(df, file_name, token, folder_id):
   with tempfile.NamedTemporaryFile(mode='w', suffix='.csv', delete=False) as temp:
       print("DataFrame: ", df)
       df.to_csv(temp, index=False, encoding='utf-8')
       print("temp.tell() size: ", temp.tell())
       print("File size: ", str(round((os.stat(temp.name).st_size/1024), 2)), "kb")
       new_file_path = tempfile.gettempdir()   '/'   customer_name   '_'   file_name   '_'    current_date   '.csv'

       ## Check if newly created renamed temp file already exist, if it does remove it to create it
       remove_temporary_file(new_file_path)
       os.link(temp.name, new_file_path)
       upload_response = upload_file(token, folder_id, new_file_path)

       ## Remove both the temp file and the newly created renamed temp file
       remove_temporary_file(temp.name)
       remove_temporary_file(new_file_path)
 

Изображение 1 (с включенной функцией temp.tell() :
Изображение 1 (с включенной функцией temp.tell()
Изображение 2 (с комментарием temp.tell() :
Изображение 2 (с комментарием temp.tell()

Комментарии:

1. Так почему бы ему не закончить писать? Не так много случаев, когда to_csv бы не закончили и не вызвали ошибку, верно? Может быть, полный диск? Что еще вас беспокоит, что код в pandas вернется, если он фактически не завершит написание файла?

2. прокомментировано ли ваше заявление с порпузом?

3. Основная проблема заключается в том, что df.to_csv() вернулся с 0 данными, записанными, как упоминалось, если я удалю эту печать(temp.tell()) Я почти всегда получаю os.stat(temp.name).st_size возвращает 0 в размере. Кроме того, я только что проверил, что на моем диске достаточно места, так что это не проблема. Это работает в направлении автоматизированного процесса, в котором я хотел бы, чтобы надежность возврата файлов с данными была как можно ближе к 100%. Обновит пример кода с выводами здесь через секунду

4. @Рафаэль, нет, это не так, жирный теребил это.

Ответ №1:

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

 def write_to_temporary_csv_file(df, file_name, token, folder_id):
   with tempfile.NamedTemporaryFile(mode='w', suffix='.csv', delete=False) as temp:
       print("DataFrame: ", df)
       df.to_csv(temp, index=False, encoding='utf-8')

   # at this point we can close the file by exiting the with block

   print("temp.tell() size: ", temp.tell())
   print("File size: ", str(round((os.stat(temp.name).st_size/1024), 2)), "kb")
   new_file_path = tempfile.gettempdir()   '/'   customer_name   '_'   file_name   '_'    current_date   '.csv'

   ## Check if newly created renamed temp file already exist, if it does remove it to create it
   remove_temporary_file(new_file_path)
   os.link(temp.name, new_file_path)
   upload_response = upload_file(token, folder_id, new_file_path)

   ## Remove both the temp file and the newly created renamed temp file
   remove_temporary_file(temp.name)
   remove_temporary_file(new_file_path)
 

Комментарии:

1. Ну, будь я проклят. Спасибо!