Хранилище Google // Облачная функция // Python Изменяет CSV-файл в корзине

# #python #csv #google-cloud-platform #google-cloud-storage

Вопрос:

спасибо, что прочитали.

У меня некоторые проблемы с касанием csv-файла в корзине, я знаю, как скопировать/переименовать/переместить файл, но я понятия не имею, как изменить файл без загрузки на локальную машину.

На самом деле у меня есть основная идея: загрузить большой двоичный объект (csv-файл) в байтах , затем изменить и загрузить в корзину в байтах. Но я не понимаю, как изменять байты.

Как я должен коснуться csv : добавьте новый заголовок — дату и добавьте значение (today.date) в каждую строку csv

—ВВОД— CSV-файл в корзину:

a b
1 2

—ВЫВОД— обновленный CSV-файл в корзине:

a b Дата
1 2 Сегодня

мой код :

 def addDataToCsv(bucket,fileName):
    today = str(date.today())

    bucket = storage_client.get_bucket(bucket)
    blob = bucket.blob(fileName)
    fileNameText = blob.download_as_string()
    
    /// This should be a magic bytes modification //

    blobNew = bucket.blob(path '/' 'mod.csv')
    blobNew.upload_from_string(fileNameText,content_type='text/csv')


 

Пожалуйста, помогите, спасибо за время и усилия

Ответ №1:

Если я правильно понимаю, вы хотите изменить CSV-файл в корзине, не загружая его в файловую систему локальной машины.

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

Объекты являются неизменяемыми, что означает, что загруженный объект не может изменяться в течение всего срока службы хранилища.

Однако подход состоял бы в использовании Cloud Storage FUSE, который монтирует хранилище облачных хранилищ в качестве файловой системы, чтобы вы могли редактировать любой файл оттуда, и изменения будут применены к вашему хранилищу.

Тем не менее, если это не подходящее решение для вас, байты можно загрузить и изменить, как вы предлагаете, путем декодирования объекта байтов (обычно используется UTF-8, хотя это зависит от ваших символов) и повторного кодирования перед загрузкой.

 # Create an array of every CSV file line
csv_array = fileNameText.decode("utf-8").split("n")
# Add header
csv_array[0] = csv_array[0]   ",daten"
# Add the date to each field
for i in range(1,len(csv_array)):
    csv_array[i] = csv_array[i]   ","   today   "n"
# Reencode from list to bytes to upload
fileNameText = ''.join(csv_array).encode("utf-8")
 

Примите во внимание, что если на вашем локальном компьютере имеются серьезные ограничения по хранению или производительности, если ваш CSV достаточно велик, чтобы это могло вызвать проблемы с его обработкой, как описано выше, или просто для справки, вы можете использовать команду compose. Для этого вам нужно будет изменить приведенный выше код, чтобы каждый раз редактировались только некоторые разделы CSV-файла, загружались, а затем объединялись gsutil compose в облачном хранилище.

Ответ №2:

Извините, я знаю, что я не на вашем месте, но на вашем месте я постараюсь все упростить. На самом деле большинство систем работают лучше всего, если они просты и их легче поддерживать и делиться (принцип ПОЦЕЛУЯ). Поэтому, учитывая, что вы используете локальную машину, я предполагаю, что у вас большая пропускная способность сети и достаточно места на диске и памяти. Поэтому я без колебаний скачаю файл, изменю его и загружу снова. Даже когда имеешь дело с большими файлами.

Затем, если вы хотите использовать другой формат файла:

загрузите большой двоичный объект (csv-файл) в байтах

В этом случае лучшим решением для размера и простого кода является использование / преобразование вашего файла в формат Parquet или Avro. Эти форматы значительно уменьшат размер файла, особенно если вы добавите сжатие. Затем они позволяют вам сохранить структуру ваших данных, что значительно упрощает их модификацию. Наконец, у вас есть много ресурсов в сети о том, как использовать эти форматы с python, и о сравнениях между CSV, Avro и Parquet.