使用lambda(python)在s3中解析/编码csv字符串时出现问题

2024-09-22 16:34:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Lambda中用python编写了一个程序,从S3中读取CSV,然后添加一些信息并将其存储到S3中的另一个CSV中

原始CSV中的初始行如下所示:

2020-04-23 00:00:00,pass,7481.15000000,7480.12000000

当我尝试阅读、添加一些信息并将其存储到S3中的第二个CSV中时,结果如下:

"b'[2020-04-21 00:00:00,pass],[2020-04-21 00:00:00,pass],[2020-04-21 00:00:00,pass],[2020-04-22 00:00:00,pass,7126.77000000,7126.56000000]\r'",b'',"[b'2020-04-23 00:00:00,pass,7481.15000000,7480.12000000\r', b'']"

显然b'\r''b''也是如此

代码如下所示:

def fetch_data_from_s3(filename):
    s3 = boto3.client('s3')
    csvfile = s3.get_object(Bucket='thisbuckername', Key=filename)
    csvcontent = csvfile['Body'].read().split(b'\n')
    return csvcontent

def write_data_to_s3(filename, row):
    s3 = boto3.client('s3')
    csvio = io.StringIO()
    writer = csv.writer(csvio)
    writer.writerow(row)
    s3.put_object(Body=csvio.getvalue(), ContentType='text/csv', Bucket='thisbucketname', Key=filename)
    csvio.close()

def lambda_handler(event, context):
    historical = fetch_data_from_s3('compiled.csv')
    last = fetch_data_from_s3('original.csv')
    historical.append(last)
    write_data_to_s3('compiled.csv', historical)

编码有什么问题吗?谢谢


Tags: csvfrom信息datas3defpassfetch
1条回答
网友
1楼 · 发布于 2024-09-22 16:34:21

通常,当文件被打开以写入字符串时,会显示“b'stuff'”,但发送的数据是字节。使用io.StringIO()而不是字节有什么原因吗

#Example
str(b'stuff')

许多编辑器和文件类型以“\r\n”结尾行,这是回车符和换行符。发生这种情况的原因很多,特别是当您有internet文件,或者来自windows和linux的文件正在转换时。在windows中只有一个字节表示“向下移动光标并移到行首”,在linux中有两个字节“\n”(向下移动光标)和“\r”(将光标移到行首)。这就是为什么在linux中可以覆盖打印行(在大多数终端中):

for i in range(1000000):
    print(i,end='\r')

您应该使用str.strip()来确保没有任何尾随“\r”或“\n”。下面是一个示例:

lines = [line.strip() for line in open(file).readlines()]

相关问题 更多 >