从S3取CSV直接导入RDS时arcpy.CopyRows参数无效问题求助
问题分析
你遇到的ExecuteError: Parameters are not valid错误,核心原因是**arcpy.CopyRows_management不接受pandas DataFrame作为in_rows参数**。这个工具的输入要求是文件路径(本地或可访问的远程URL)、表视图、要素类、图层这类ArcGIS原生支持的数据源,而DataFrame不在这个范围内。
下面给你几个可行的解决方案,根据你的需求选择:
方案1:直接使用S3生成的URL作为输入(最简单高效)
如果你的CSV不需要预处理,可以直接用S3生成的可访问URL作为CopyRows的输入,完全不用下载到本地,也不需要pandas介入:
import arcpy import boto import boto.s3.connection access_key = '你的AWS访问密钥' secret_key = '你的AWS秘密密钥' # 连接S3服务 conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host='s3.amazonaws.com' ) bucket = conn.get_bucket('mybucket') s3_key = bucket.get_key('file1.csv') # 生成可访问的URL: # - 如果文件是公开的,用query_auth=False生成无签名URL # - 如果文件是私有桶,用query_auth=True生成带签名的临时URL(设置有效期,比如3600秒) s3_csv_url = s3_key.generate_url( expires_in=3600, # 私有文件需设置有效期,公开文件可设为0 query_auth=True, # 私有文件设为True,公开文件设为False force_http=True ) arcpy.env.overwriteOutput = True # 直接将S3 URL作为数据源复制到RDS表 arcpy.CopyRows_management(s3_csv_url, "RDSTablePath", "") print("Copy rows completed successfully")
方案2:预处理数据后使用内存临时表
如果需要先用pandas清洗/修改CSV数据,你可以把处理后的DataFrame转成ArcGIS支持的内存临时表,再用CopyRows复制到RDS:
import arcpy from boto.s3.key import Key import StringIO import pandas as pd import boto import boto.s3.connection access_key = '你的AWS访问密钥' secret_key = '你的AWS秘密密钥' conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host='s3.amazonaws.com' ) bucket = conn.get_bucket('mybucket') s3_key = bucket.get_key('file1.csv') # 读取S3内容到DataFrame并做预处理 content = s3_key.get_contents_as_string() df = pd.read_csv(StringIO.StringIO(content)) # 这里添加你的数据清洗逻辑,比如: # df = df.dropna() # df['column'] = df['column'].astype(int) # 将处理后的DataFrame写入内存CSV缓冲区 csv_buffer = StringIO.StringIO() df.to_csv(csv_buffer, index=False) csv_buffer.seek(0) # 重置缓冲区指针到开头 # 将内存CSV转成ArcGIS内存临时表 temp_table = "in_memory/temp_csv_table" arcpy.TextFileToTable_conversion(csv_buffer, temp_table) # 复制临时表到RDS arcpy.CopyRows_management(temp_table, "RDSTablePath", "") print("Copy rows completed successfully")
方案3:使用InsertCursor逐行插入数据
如果需要更精细的控制(比如逐条处理数据),可以用arcpy.da.InsertCursor直接把DataFrame的行插入到RDS表:
import arcpy from boto.s3.key import Key import StringIO import pandas as pd import boto import boto.s3.connection access_key = '你的AWS访问密钥' secret_key = '你的AWS秘密密钥' conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host='s3.amazonaws.com' ) bucket = conn.get_bucket('mybucket') s3_key = bucket.get_key('file1.csv') # 读取并处理数据 content = s3_key.get_contents_as_string() df = pd.read_csv(StringIO.StringIO(content)) # 数据预处理逻辑... # 获取RDS表的字段列表(确保和CSV列名顺序/名称一致) fields = list(df.columns) # 使用InsertCursor插入数据 with arcpy.da.InsertCursor("RDSTablePath", fields) as cursor: for _, row in df.iterrows(): # 将DataFrame行转为元组,适配InsertCursor的要求 cursor.insertRow(tuple(row)) print("Data inserted successfully")
内容的提问来源于stack exchange,提问作者Matrix
相关产品推荐
相关产品推荐

