Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从aws s3 bucket读取lambda中zip文件中的.csv_Python_Pandas_Amazon Web Services_Amazon S3 - Fatal编程技术网

Python 从aws s3 bucket读取lambda中zip文件中的.csv

Python 从aws s3 bucket读取lambda中zip文件中的.csv,python,pandas,amazon-web-services,amazon-s3,Python,Pandas,Amazon Web Services,Amazon S3,我在s3存储桶中有一个zip文件。我在内存中解压该zip文件(不解压),并将.csv中的数据转储到数据库中的表中。但在转储这些表时,由于程序按csv的顺序转储csv,因此会先转储一些表,然后再转储其他表。例如,我有两个表“dealer_master”和“billing_master”,两个表的结构: 1) 经销商数据 经销商id:主键 国家 枕形 地址 创建日期 2) 计费数据 票据id:主键 经销商id:外键 账单金额 账单日期 在zip文件中,我在经销商数据之前获取账单数据。因此,获

我在s3存储桶中有一个zip文件。我在内存中解压该zip文件(不解压),并将.csv中的数据转储到数据库中的表中。但在转储这些表时,由于程序按csv的顺序转储csv,因此会先转储一些表,然后再转储其他表。例如,我有两个表“dealer_master”和“billing_master”,两个表的结构:

1) 经销商数据

  • 经销商id:主键
  • 国家
  • 枕形
  • 地址
  • 创建日期
2) 计费数据

  • 票据id:主键
  • 经销商id:外键
  • 账单金额
  • 账单日期
在zip文件中,我在经销商数据之前获取账单数据。因此,获取“外键约束错误”。为了解决上述问题,我在连接数据库时关闭了外键约束。是否有其他方法可以将表以正确的顺序转储到数据库中? 我可以在内存中存储表一段时间,然后以我想要的方式转储它们吗

我的代码是这样的:

def etl_job():

`data = json.load(open('path_to_json'))`

 `logger = helpers.setup_logging()`

 `s3_client = boto3.client('s3',aws_access_key_id=data['aws_access_key_id'],
                    aws_secret_access_key=data['aws_secret_access_key'])`  

`s3_resource = boto3.resource('s3',aws_access_key_id=data['aws_access_key_id'],
                    aws_secret_access_key=data['aws_secret_access_key'])`  

`keys = []`  
`resp = s3_client.list_objects_v2(Bucket=bucket_name)`
`for obj in resp['Contents']:`        
   `keys.append(obj['Key'])
 for key in keys:
   names =  key.split("/")
   obj = s3_resource.Bucket(bucket_name).Object(helpers.zip_file_name())
 buffer = io.BytesIO(obj.get()["Body"].read())
 zip_file = zipfile.ZipFile(buffer,'r')
 logger.info("Name of csv in zip file :%s",zip_file.namelist())
 logs = ""
 dataframe = pd.DataFrame()
 for name_of_zipfile in zip_file.namelist():
    zip_open = pd.read_csv(zip_file.open(name_of_zipfile))
    zip_open = zip_open.dropna()
    table_name = "{name}".format(name=name_of_zipfile.replace('.csv',''))
    try :
        zip_open.to_sql(name=name_of_zipfile.replace('.csv',''), con=database.db_connection(), if_exists = 'append', index=False)
    except SQLAlchemyError as sqlalchemy_error:
        print sqlalchemy_error
 database.db_connection().execute('SET FOREIGN_KEY_CHECKS=1;')`