[英]Skipping header in CSV file
我正在使用 lambda function 添加来自 csv 文件的数据,但我在 dynamodb 中的表中有一个错误我看到我的标题也在表中的一行这是我的代码:
import boto3
s3=boto3.client("s3")
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('maysales')
def lambda_handler(event, context):
bucketna=event['Records'][0]['s3']['bucket']['name']
s3_name=event['Records'][0]['s3']['object']['key']
response=s3.get_object(Bucket=bucketn,Key=s3_name)
data=response['Body'].read().decode("utf-8")
salesnbs=data.split("\n")
for ko in salesnbs:
kos=ko.split(",")
table.put_item(
Item = {
"Date": kos[0],
"name": kos[1],
"fam": kos[2],
"locati": kos[3],
"adress": kos[4],
"country": kos[5],
"city": kos[6]
})
我的表已经包含标题:
目前尚不完全清楚描述中的问题是什么,但我建议使用 Python 的内置模块csv来处理 CSV 数据。 这样您就不必担心标题和将文件拆分为列,因为模块为此提供了工具。
import csv
...
# Here you can also specify delimiter if need be
reader = csv.DictReader(response['Body'])
for row in reader:
table.put_item(
Item = {
"Date": row["Date"],
"name": row["name"],
"fam": row["fam"],
...
})
模块使用文件的第一行作为列名。
大多数 CSV 文件的第一行包含 header 标签,如果您不想将该行添加到 dynamodb 表中,则需要在开始插入之前跳过第一行,即:
row = 0
for ko in salesnbs:
if row == 0:
continue # don't process this line
row = row + 1
kos=ko.split(",")
table.put_item(
Item = {
"Date": kos[0],
"name": kos[1],
"fam": kos[2],
"locati": kos[3],
"adress": kos[4],
"country": kos[5],
"city": kos[6]
})
(语法可能不是 100% 正确,但这就是想法)
现在从@EJ Brennan 的修改代码下面,我们可以在将 csv 文件从 s3 推送到 dynamodb 时跳过 header。 下面的一段代码替换成你的 lambda function。
import boto3
s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('yourdynamodbtablename')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
s3_file_name = event['Records'][0]['s3']['object']['key']
response = s3_client.get_object(Bucket=bucket,Key=s3_file_name)
fileData = response['Body'].read().decode("utf-8")
print(fileData)
modelData = fileData.split("\n")
header = 0
for row in modelData:
print(row)
if header == 0:
header = header+1
continue
row_data = row.split(",")
try:
table.put_item(
Item = {
'ID': row_data[0],
'NAME': row_data[1],
'SUBJECT': row_data[2]
}
)
except Exceptions as e:
print('End of File')
return 'news rows were inserted successful without header into db'
使用 boto3 客户端而不是资源。 安装dynamodb-json
from dynamodb_json import json_util as dynamo_json
import json
import boto3
s3=boto3.client("s3")
dynamodb = boto3.client('dynamodb')
def lambda_handler(event, context):
bucketna=event['Records'][0]['s3']['bucket']['name']
s3_name=event['Records'][0]['s3']['object']['key']
response=s3.get_object(Bucket=bucketn,Key=s3_name)
data=response['Body'].read().decode("utf-8")
salesnbs=data.split("\n")
for ko in salesnbs:
kos=ko.split(",")
data = {
"Date": kos[0],
"name": kos[1],
"fam": kos[2],
"locati": kos[3],
"adress": kos[4],
"country": kos[5],
"city": kos[6]
}
client.put_item(TableName='maysales',Item=json.loads(dynamo_json.dumps(data)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.