Оператор Insert, возвращающий «объект не имеет атрибута «uuid»

#python #pandas #dataframe #aws-lambda

Вопрос:

Я работаю над вставкой некоторого кода в sql server, и я продолжаю сталкиваться со следующей ошибкой:

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

Мой код выглядит так:

 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
                        )
 

Я думал, что пропуск первой строки из-за того, что это заголовки, исправит это, но на самом деле это не так. Помогите, пожалуйста!

Комментарии:

1. Где ты пропускаешь заголовки? И если вы пропускаете заголовки, как панды должны знать, что у вас есть столбец под названием uuid ? Вы распечатали data_df , чтобы посмотреть, что вы на самом деле получаете?

2. Основываясь на комментарии Тима, иногда в CSV в именах столбцов появляются дополнительные пробелы. Убедитесь, что у вас "uuid " , например, нет.

3. да, поэтому я обновил свой код до следующего for row in data_df[1:] , чтобы убедиться, что я получил следующую строку, и она по-прежнему выдавала мне ту же ошибку "errorMessage": 'str' object has no attribute 'uuid'" , что и при печати data_df, которую я получил hq948h4q4 , Vasquez , 0777848502

4. @26Cocktails: это не имело бы никакого значения, потому что каждая строка имеет атрибуты или нет.

5. @26Cocktails: print(data_df.columns) может быть?

Ответ №1:

Я совершенно уверен, что это и есть источник вашей проблемы:

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

Тела объектов S3 возвращаются в виде потока. Вы считываете поток в объект, а затем пытаетесь повторно передать его с помощью строки. —

Я все время передаю 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, вы, вероятно, вызываете некоторые ошибки кодирования/декодирования, которые вызывают проблемы в ваших строках.

Комментарии:

1. так ты говоришь убрать стингИО?

2. Когда я распечатываю свой df после csv_string = data_body.read().decode('utf-8') data_df = pd.read_csv(StringIO(csv_string)) того, как он распечатает все просто отлично.

3. print() прочитает его в соответствии с UTF-8, как вы его расшифровали, так что он будет «выглядеть» нормально, но в них может быть что-то, чего печать не показывает. Но… я тоже могу ошибаться в этом.