TypeError:需要类似字节的对象,而不是';str';使用无服务器和Python 3

TypeError:需要类似字节的对象,而不是';str';使用无服务器和Python 3,python,csv,amazon-web-services,amazon-s3,serverless-framework,Python,Csv,Amazon Web Services,Amazon S3,Serverless Framework,我有一个aws lambda函数,每当CSV文件上传到s3 bucket时就会触发该函数。我在Python3.6中使用无服务器框架,问题是我收到了这个错误消息 需要类似字节的对象,而不是“str”:TypeError 回溯(最近一次呼叫最后一次): csvfile中第33行的文件“/var/task/handler.py” fichier=obj['Body'].read().split('\n') TypeError:需要类似字节的对象,而不是“str” 我在网上做了一些研究,问题是我没有使用

我有一个aws lambda函数,每当CSV文件上传到s3 bucket时就会触发该函数。我在Python3.6中使用无服务器框架,问题是我收到了这个错误消息

需要类似字节的对象,而不是“str”:TypeError

回溯(最近一次呼叫最后一次):

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

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()
返回一个
字节
对象,而不是字符串。这是因为编码可能需要不止一个字符。现在,您正在对
字节
对象使用
拆分
,但不能使用字符串拆分,您需要使用另一个
字节
对象进行拆分。具体地

fichier = obj['Body'].read().split(b'\n')
应该修复错误,但根据您的期望,在拆分之前解码可能更合适

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

fichier = obj['Body'].read()
返回一个
字节
对象,而不是字符串。这是因为编码可能需要不止一个字符。现在,您正在对
字节
对象使用
拆分
,但不能使用字符串拆分,您需要使用另一个
字节
对象进行拆分。具体地

fichier = obj['Body'].read().split(b'\n')
应该修复错误,但根据您的期望,在拆分之前解码可能更合适

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

请把全部都寄出去traceback@brunodesthuilliers我刚写完,请把全部内容都发出去traceback@brunodesthuilliers我刚刚试过,我已经试过了,我收到了错误消息:“str”对象没有属性“decode”:AttributeError回溯(最近一次调用):File“/var/task/handler.py”,第38行,在csvfile logger.info(ligne.decode())中,AttributeError:'str'对象没有属性'decode','这是另一个问题。您将
fichier
转换为带有最后一个解码的字符串,我猜您在代码的其他地方按原样传递了它,但需要一个bytes对象-我不打算为您调试,堆栈应该会有帮助。你可以在所有地方都使用字节-使用第一个版本,在任何地方都使用
bytes
。@kabanus,这个解决方案适合我。我正在从S3文件读取数据,由于字节格式的原因,在分割数据时出错。我之前已经尝试过了,我收到了错误消息:“str”对象没有“decode”属性:AttributeError回溯(上次调用):csvfile logger.info(ligne.decode())中的file“/var/task/handler.py”,第38行AttributeError:'str'对象没有属性'decode','这是另一个问题。您将
fichier
转换为带有最后一个解码的字符串,我猜您在代码的其他地方按原样传递了它,但需要一个bytes对象-我不打算为您调试,堆栈应该会有帮助。你可以在所有地方都使用字节-使用第一个版本,在任何地方都使用
bytes
。@kabanus,这个解决方案适合我。我从S3文件中读取数据,由于字节格式的原因,在分割数据时出错。