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

Я пытаюсь прочитать schema из файла text в том же пакете, что и код, но не могу прочитать этот файл с помощью задания склеивания AWS. Я буду использовать это schema для создания фрейма данных с помощью Pyspark. Я могу загрузить этот файл локально. Я сжимаю файлы кода в формате .zip, помещаю их в корзину s3, а затем ссылаюсь на них в работе по склеиванию. Все остальное работает нормально. Никаких проблем. Но когда я пробую приведенный ниже код, он не работает.

file_path = os.path.join(Path(os.path.dirname(os.path.relpath(__file__))), "verifications.txt")
multiline_data = None
with open(file_path, 'r') as data_file:
   multiline_data = data_file.read()
self.logger.info(f"Schema is {multiline_data}")
           

Этот код выдает следующую ошибку:

Error Category: UNCLASSIFIED_ERROR; NotADirectoryError: [Errno 20] Not a directory: 'src.zip/src/ingestion/jobs/verifications.txt'  

Я тоже пробовал с abs_path, но тоже не помогло. Тот же блок кода отлично работает локально.

Я также пытался пройти путь "./verifications.txt" напрямую, но безуспешно.

И как мне прочитать этот файл?

🤔 А знаете ли вы, что...
Python подходит для начинающих программистов благодаря своей простоте и читаемости кода.


98
2

Ответы:

Скрипты AWS Glue обычно выполняются в управляемой среде, то есть ваш файл не виден сценарию ETL. Причина, по которой импорт работает на вашем локальном компьютере, заключается в том, что файл доступен оттуда, поскольку оба находятся на одном компьютере. Для таких работ рассмотрите возможность использования S3 для хранения файлов.


Решено

Как упомянул @Bogdan, способ сделать это — использовать S3 для хранения файла verifications.txt. Вот пример кода с использованием boto3

import boto3

# Hardcoded S3 bucket/key (these are normally passed in as Glue Job params)
s3_bucket = 'your-bucket-name'
s3_key = 'path/to/verifications.txt'

# Read data from S3 using boto3
s3_client = boto3.client('s3')
response = s3_client.get_object(Bucket=s3_bucket, Key=s3_key)
multiline_data = response['Body'].read().decode('utf-8')

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

import boto3
import zipfile
import io

# Initialize boto3 client for S3
s3 = boto3.client('s3')

# Define the bucket name and the zip file key
bucket_name = 'your-bucket-name'
zip_file_key = 'path/to/src.zip'

# Download the zip file from S3
zip_obj = s3.get_object(Bucket=bucket_name, Key=zip_file_key)
buffer = io.BytesIO(zip_obj['Body'].read())

# Open the zip file in memory
with zipfile.ZipFile(buffer, 'r') as zip_ref:
    # List all files in the zip
    print("Files in the zip:", zip_ref.namelist())

    # Open and read a specific file within the zip without extracting
    with zip_ref.open('verifications.txt') as file:
        text_content = file.read().decode('utf-8')
        print("Contents of the text file:", text_content)