在s3中用lambda(python)解析csv中字符串的问题

我用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)

是不是编码有问题?谢谢!

解决方案:

一般情况下,当一个文件被打开后会出现 “b’stuff'”来写字符串,但发送的数据是字节。有什么原因让你使用io.StringIO()而不是Bytes?

#Example
str(b'stuff')

许多编辑器和文件类型都会在行末加上”\r\n”,这是一个回车符号和一个换行符号。发生这种情况有很多原因,特别是当你有互联网文件,或者是来自windows和linux的文件被转换时。在windows中,只有一个字节表示 “将curser向下移动并转到行首”,而在linux中,有两个字节”\n”(将curser向下移动)和”\r”(将curser转到行首)。这就是为什么在linux中你可以覆盖一个打印的行(在大多数终端中)。

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

你应该使用str.strip()来确保你没有任何尾部的”/r “或”/n”. 下面是一个例子。

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

给TA打赏
共{{data.count}}人
人已打赏
未分类

在Laravel中获取数据时, API的加载时间非常慢.

2022-9-8 19:59:36

未分类

Windows应用程序在点击按钮时大部分时间都会冻结。

2022-9-8 19:59:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索