繁体   English   中英

TypeError:需要一个类似字节的对象,对于无服务器和Python3来说不是'str'

[英]TypeError: a bytes-like object is required, not 'str' with serverless and Python3

我有一个aws-lambda函数,只要将CSV文件上传到s3存储桶,就会触发该函数。 我正在使用Python 3.6的无服务器框架,问题是我收到此错误消息

需要一个类似字节的对象,而不是'str':TypeError

追溯(最近一次通话):

csvfile中的文件“ /var/task/handler.py”,第33行

fichier = obj ['Body']。read()。split('\\ n')

TypeError:需要一个类似字节的对象,而不是'str'

我已经做了在网的一些研究这里的问题,是我不使用Open方法导致文件被S3事件看所以不知道如何解决它

这是我的代码:

import logging
import boto3
from nvd3 import pieChart
import sys
import csv


xdata = []
ydata = []
xdata1 = []
ydata1 = []


logger = logging.getLogger()
logger.setLevel(logging.INFO)

def csvfile(event, context):

    s3 = boto3.client('s3')    
    # retrieve bucket name and file_key from the S3 event
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    file_key = event['Records'][0]['s3']['object']['key']
    logger.info('Reading {} from {}'.format(file_key, bucket_name))
    # get the object
    obj = s3.get_object(Bucket=bucket_name, Key=file_key)
    # get lines inside the csv
    fichier = obj['Body'].read().split('\n')
    #print lines
     for ligne in fichier:
        if len(ligne) > 1:
            logger.info(ligne.decode())
            liste = ligne.split(',')
            print(liste)
            if liste[2] == 'ByCateg':
                xdata.append(liste[4]) 
                ydata.append(liste[1]) 
            elif liste[2] == 'ByTypes':
                xdata1.append(liste[4]) 
                ydata1.append(liste[1]) 

         print ' '.join(xdata) 

print('Function execution Completed')

这是我的serverless.yml代码:

service: aws-python # NOTE: update this with your service name

provider:
  name: aws
  runtime: python3.6
  stage: dev
  region: us-east-1
  iamRoleStatements:
        - Effect: "Allow"
          Action:
              - s3:*
              - "ses:SendEmail"
              - "ses:SendRawEmail"
              - "s3:PutBucketNotification"
          Resource: "*"

    functions:
  csvfile:
    handler: handler.csvfile
    description: send mail whenever a csv file is uploaded on S3 
    events:
      - s3:
          bucket: car2
          event: s3:ObjectCreated:*
          rules:
            - suffix: .csv

问题是

fichier = obj['Body'].read()

返回一个bytes对象,而不是一个字符串。 这是因为编码可能需要多个字符。 现在,您正在对bytes对象使用split ,但是不能使用字符串进行split,您需要使用另一个bytes对象进行拆分。 特别

fichier = obj['Body'].read().split(b'\n')

应该可以解决您的错误,但是根据您的期望,在拆分之前解码是否更合适?

fichier = obj['Body'].read().decode("utf-8").split('\n')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM