Я загружаю файл из ковша S3 в качестве байтового потока, сохраняя его
локально, а затем читая его с Pandas. < /li>
Правильно загружается и сохраняет файл (насколько я могу судить): < /li>
Размер файла соответствует тому, что сообщается в S3. Файл сохраняется локально без ошибок. br /> Что я пробовал: < /strong> < /p>
вручную загружать и читать Файл: он работает отлично, когда я вручную загружаю файл с S3 с помощью консоли AWS и загружаю его в панды. У него даже было более миллиона рядов. Обычно он обнаруживает UTF-8, ASCII или аналогичное кодирование для байтового потока. Я также пытался вручную установить кодирование, но это тоже не сработало. В байтах от S3 в локальную память я подумал, что, возможно, что -то не так со строительством файла с использованием байтов, поэтому в качестве механизма резерва я добавил чек, который загрузил бы весь файл из S3, если подсчет строки для файла равно 0 (с подходом байта), но это было безрезультатно. Содержание файла они появляются как двоичные нули (\ x00), что кажется неправильным. ПРИМЕЧАНИЕ. При загрузке вручную и открыты с использованием Pandas. p>
Загруженный вручную файл отлично работает с пандами, поэтому файл в S3 не поврежден. < /li>
Моя текущая реализация включает загрузку файла в кусочках, реконструкцию его из потока, а затем сохранение его локально. не загружает строки в панд.s3 = boto3.client('s3', region_name='', aws_access_key_id='', aws_secret_access_key='')
S3_BUCKET_NAME = ""
S3_FILE_KEY = ""
def download_and_read_file(s3_bucket, s3_key):
try:
print(f"Downloading file: {s3_key}")
response = s3.get_object(Bucket=s3_bucket, Key=s3_key)
file_content = response['Body'].read()
local_filename = "downloaded_file.csv"
with open(local_filename, "wb") as f:
f.write(file_content)
print(f"File saved locally as {local_filename}")
# loading the file into pandas
df = pd.read_csv(local_filename, low_memory=False)
print(f"Total rows in DataFrame: {df.shape[0]}")
print(df.head())
except Exception as e:
print(f"Error: {e}")
# calling the function
download_and_read_file(S3_BUCKET_NAME, S3_FILE_KEY)
< /code>
Absolutely any insight will be appreciated.
Below is an output example showcasing the my byte approach does work for some csv files:
Downloading missing chunk: bytes=0-104857599
Updated byte_progress_log.txt locally.
Uploaded byte_progress_log.txt to S3.
Downloading missing chunk: bytes=104857600-209715199
Updated byte_progress_log.txt locally.
Uploaded byte_progress_log.txt to S3.
Downloading missing chunk: bytes=209715200-314572799
Updated byte_progress_log.txt locally.
Uploaded byte_progress_log.txt to S3.
Downloading missing chunk: bytes=314572800-419430399
Updated byte_progress_log.txt locally.
Uploaded byte_progress_log.txt to S3.
Downloading missing chunk: bytes=419430400-524287999
Updated byte_progress_log.txt locally.
Uploaded byte_progress_log.txt to S3.
Downloading missing chunk: bytes=524288000-549793036
Updated byte_progress_log.txt locally.
Uploaded byte_progress_log.txt to S3.
Buffer size after downloading missing chunks: 549793037 bytes
Download complete
File saved
Successfully loaded file into pandas. Total rows: 1287454
But for some csv files, this same approach gives me 0 rows. I then tried downloading that same file manually from S3 and did:
data = pd.read_csv("path",low_memory=False)
total_rows = data.shape[0]
print(total_rows)
Now, that works like a charm. However, the below code gives me 0 rows:
# re-attempting to load the file with pandas
df = pd.read_csv(local_filepath, low_memory=False)
total_rows = df.shape[0]
print(f"
print(df.head())
Подробнее здесь: https://stackoverflow.com/questions/793 ... l-download