【问题标题】:Insert statement returning 'object has no attribute 'uuid'插入语句返回'对象没有属性'uuid'
【发布时间】:2021-12-09 09:33:44
【问题描述】:

我正在向 sql server 中插入一些代码,但一直遇到以下错误:

{
  "errorMessage": 'str' object has no attribute 'uuid'"
  "errorType": AttributeError",
  "stackTrace": [
   File \"/var/task/data_insert/clean_sweep.py\", line 17 , row.uuid\n"
  ]
}

我的代码如下:

client = boto3.client('s3')
my_bucket = 'data-staging'
data_filename = 'data_pull.csv'
insert_csv = client.get_object(Bucket = my_bucket, Key = data_filename)
data_body = insert_csv["body"]
csv_string = data_body.read().decode('utf-8')
data_df = pd.read_csv(StringIO(csv_string))

conn = pymssql.connect(server = 'rds_sqlserver.com', user='etl_xu',password = 'XU2014basketball', database = 'Xacation')
cursor = conn.cursor()
for row in data_df.itterrows():
cursor.execute('''INSERT INTO xac.staging(uuid, last_name, xac_account)
                        VALUES(?,?,?)
                        '''
                        , row.uuid
                        , row.last_name
                        , row.xac_account
                        )

我认为跳过第一行,因为它是标题会解决它,但事实并非如此。请帮忙!

【问题讨论】:

  • 你在哪里跳过标题?如果您跳过标题,熊猫应该如何知道您有一个名为uuid 的列?您是否打印了data_df 以查看您实际得到了什么?
  • 基于 Tim 的评论,有时对于 CSV,列名中有额外的空格。例如,检查您是否没有"uuid "
  • 是的,所以我确实将我的代码更新为以下for row in data_df[1:],以确保我得到下一行,但它仍然给我同样的错误,只是"errorMessage": 'str' object has no attribute 'uuid'"打印data_df时我得到@987654328 @,Vasquez, 0777848502
  • @26Cocktails:这不会有任何区别,因为每一行都有属性或没有属性。
  • @26Cocktails: print(data_df.columns) 也许?

标签: python pandas dataframe aws-lambda


【解决方案1】:

我很确定这是您问题的根源:

csv_string = data_body.read().decode('utf-8')
data_df = pd.read_csv(StringIO(csv_string)) 

S3 对象主体作为流返回。您正在将流读入一个对象,然后尝试使用 StringIO 重新流式传输它 -

我一直将 XML 文件从 s3 流式传输到 xml.etree.ElementTree.fromstring(),这需要某种排序字节流或字符串 - 只需使用:

xml_s3_object = s3.get_object(Bucket=bucket_name, Key=object_key)['Body'].read()
tree = ET.fromstring(xml_s3_object)

因此,由于您正在对其进行解码,然后使用 StringIO 对其进行重新流式传输,因此您可能会导致一些编码/解码错误,从而导致您的行出现问题。

【讨论】:

  • 所以你是说删除 stingIO?
  • 当我在csv_string = data_body.read().decode('utf-8') data_df = pd.read_csv(StringIO(csv_string)) 之后打印出我的 df 时,它打印的一切都很好。
  • print() 将根据您将其解码为的 UTF-8 读取它,因此它会“看起来”很好,但它们中可能有一些打印未显示的内容。但是......我也可能是错的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2013-10-19
  • 2021-05-02
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多