file.csvをS3バケットにドロップすると、私のラムダ関数から以下のエラーが表示されます。ファイルは大きくなく、私は読書のためにファイルを開く前に60秒の睡眠を加えましたが、何らかの理由でファイルに余分な ".6CEdFe7C"が付いています。何故ですか?Python読み取り専用ファイルシステム読み込み用ファイルを開くときにS3とLambdaでエラーが発生する
[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C': IOError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 75, in lambda_handler
s3.download_file(bucket, key, filepath)
File "/var/runtime/boto3/s3/inject.py", line 104, in download_file
extra_args=ExtraArgs, callback=Callback)
File "/var/runtime/boto3/s3/transfer.py", line 670, in download_file
extra_args, callback)
File "/var/runtime/boto3/s3/transfer.py", line 685, in _download_file
self._get_object(bucket, key, filename, extra_args, callback)
File "/var/runtime/boto3/s3/transfer.py", line 709, in _get_object
extra_args, callback)
File "/var/runtime/boto3/s3/transfer.py", line 723, in _do_get_object
with self._osutil.open(filename, 'wb') as f:
File "/var/runtime/boto3/s3/transfer.py", line 332, in open
return open(filename, mode)
IOError: [Errno 30] Read-only file system: u'/file.csv.6CEdFe7C'
コード:
def lambda_handler(event, context):
s3_response = {}
counter = 0
event_records = event.get("Records", [])
s3_items = []
for event_record in event_records:
if "s3" in event_record:
bucket = event_record["s3"]["bucket"]["name"]
key = event_record["s3"]["object"]["key"]
filepath = '/' + key
print(bucket)
print(key)
print(filepath)
s3.download_file(bucket, key, filepath)
上記の結果は次のとおりです。
mytestbucket
file.csv
/file.csv
[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C'
キー/ファイルは "file.csvになり" であるならば、なぜs3.download_file方法はありません"file.csv.6CEdFe7C"をダウンロードしてください。関数がトリガされたとき、ファイルはfile.csv.xxxxxですが、75行目になるとファイルはfile.csvにリネームされます。
ダンプは読み込みと同じではありません!したがって、一時フォルダ(またはRAM)上のファイルは、 'self._osutil.open(filename、 'wb')をf:'としてダンプする必要はなく、 'rb'etcしか許されません。処理する前にソースファイルを処理する必要があります。 – dsgdfg