#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
, 07778485024. @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, как вы его расшифровали, так что он будет «выглядеть» нормально, но в них может быть что-то, чего печать не показывает. Но… я тоже могу ошибаться в этом.