Lambda 함수 내부에서 S3 버킷에 CSV 파일을 쓰려고합니다. 특수 문자를 캡처 할 수 없다는 점을 제외하면 모든 것이 정상입니다. 기본적으로 파일이 UTF-8로 인코딩되어야합니다. pandas 또는 unicodecsv는 Lambda의 환경에 내장되어 있지 않으므로 사용하고 싶지 않습니다.
다음은 현재 Lambda 함수입니다.
import boto3
import csv
import io
def lambda_handler(event, context):
s3 = boto3.resource('s3')
bucket = s3.Bucket("my-bucket-name-goes-here")
fn = "sample_csv_lambda.csv"
write_csv(fn, bucket)
def write_csv(target_filename, bucket):
buff = io.StringIO()
writer = csv.writer(buff, dialect="excel", delimiter=",")
writer.writerow([f"header{i}" for i in range(1, 6)])
writer.writerow([1, 2, 3, 4, 5])
writer.writerow(["u", "b", "w", "d", "ş"])
writer.writerow(["n", "p", "m", "q", "ğ"])
buff2 = io.BytesIO(buff.getvalue().encode(encoding="UTF-8"))
print(buff2.getvalue().decode("utf-8"))
bucket.upload_fileobj(buff2, target_filename)
마지막에서 두 번째 줄의 인쇄 값은 의도 한대로 특수 문자를 출력하지만 CSV 파일을 다운로드하여 열면 여전히 UTF-8이 아닙니다.
추신 : 다른 질문 / 답변에서 제안한대로 "/ tmp"폴더에 파일을 임시로 저장할 필요가 없기 때문에 현재 코드 형식이 마음에 듭니다. 또한 내 Lambda 환경에 pandas / unicodecsv를 패키징하고 업로드 할 필요가 없습니다. 나 같은 초보자에게는 너무 복잡합니다. 대답 할 때 이것을 명심하십시오.
짧은 대답
파일이 BOM없이 이미 UTF8입니다. BOM을 내보내려면 인코딩 할 때 utf-8-sig
대신 사용하십시오 utf-8
.
긴 답변
댓글에서 파일을 두 번 클릭하여 Excel에서 CSV 파일을 열려고하는 것 같습니다. 그렇게하면 Excel은 기본 설정을 사용하여 파일 내용을 가져옵니다 . BOM이있는 경우 Excel은 BOM에 지정된 인코딩을 사용하여 파일을로드합니다. 그렇지 않으면 어떤 인코딩이 사용되었는지 추측 할 방법이 없으므로 Excel은 사용자의 로캘 설정을 사용하여 데이터를 가져옵니다.
데이터 메뉴를 사용하여 데이터를 가져온 경우 Excel에서 파일 미리보기를 표시하고 인코딩, 구분 기호 등과 같은 설정을 수정할 수 있습니다.
Excel에서 해당 파일을 사용하려면 openpyxl
실제 xlsx
파일 을 만드는 것과 같은 라이브러리를 사용하는 것이 좋습니다 . An xlsx
은 잘 정의 된 XML 파일을 포함하는 ZIP 패키지입니다. xlsx
파일은 일반적으로 해당 CSV 파일보다 훨씬 작은 숫자와 날짜가 더 현지화 문제가 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다