проблема с парсингом / кодированием строк в csv в s3 с лямбдой (python) - PullRequest
0 голосов
/ 24 апреля 2020

Я написал программу в python в Lambda, чтобы прочитать CSV из S3, а затем добавить некоторую информацию и сохранить ее в другом CSV в S3.

Начальная строка в исходном CSV выглядит следующим образом :

2020-04-23 00:00:00,pass,7481.15000000,7480.12000000

Когда я пытаюсь прочитать, добавить некоторую информацию и сохранить ее во втором CSV-файле в S3, это выглядит так:

"b'[2020-04-21 00:00:00,pass],[2020-04-21 00:00:00,pass],[2020-04-21 00:00:00,pass],[2020-04-22 00:00:00,pass,7126.77000000,7126.56000000]\r'",b'',"[b'2020-04-23 00:00:00,pass,7481.15000000,7480.12000000\r', b'']"

Так что, очевидно, с b' и \r''b''

Код выглядит следующим образом:

def fetch_data_from_s3(filename):
    s3 = boto3.client('s3')
    csvfile = s3.get_object(Bucket='thisbuckername', Key=filename)
    csvcontent = csvfile['Body'].read().split(b'\n')
    return csvcontent

def write_data_to_s3(filename, row):
    s3 = boto3.client('s3')
    csvio = io.StringIO()
    writer = csv.writer(csvio)
    writer.writerow(row)
    s3.put_object(Body=csvio.getvalue(), ContentType='text/csv', Bucket='thisbucketname', Key=filename)
    csvio.close()

def lambda_handler(event, context):
    historical = fetch_data_from_s3('compiled.csv')
    last = fetch_data_from_s3('original.csv')
    historical.append(last)
    write_data_to_s3('compiled.csv', historical)

Что-то не так с кодировкой? Спасибо!

1 Ответ

0 голосов
/ 24 апреля 2020

Обычно "b'stuff" отображается, когда файл был открыт для записи строк, но данные отправляются в байтах. Есть ли причина, по которой вы используете io.StringIO () вместо Bytes?

#Example
str(b'stuff')

Многие редакторы и типы файлов заканчивают строки знаком "\ r \ n", который является символом возврата каретки и символом новой строки. Это происходит по многим причинам, особенно когда у вас есть целые rnet файлы или файлы из windows и linux, которые конвертируются. В windows есть только один байт, который означает «переместить курсор вниз и go в начало строки», в linux есть два байта «\ n» (переместить курсор вниз) и «\ r» ( переместить курсор в начало строки ". Вот почему в linux вы можете перезаписать напечатанную строку (в большинстве терминалов):

for i in range(1000000):
    print(i,end='\r')

Вы должны использовать str.strip (), чтобы Не должно быть никаких "\ r" или "\ n". Вот пример:

lines = [line.strip() for line in open(file).readlines()]
...