我正在使用熊猫“ read_csv”从亚马逊s3存储桶中读取.csv文件。以下是我发表的声明:
xyz = pd.read_csv(io.BytesIO(obj['Body'].read()), dtype={'col1': str ,'col2':int,'col3':int ,'col4':int} ,encoding='latin-1')
现在这是我的问题; col2包含一些特殊字符,例如“`”,而col3包含“:”。那么在python中有没有一种方法可以通过扫描S3存储桶中.csv文件中的所有记录来重定向临时列表中的这些不良行?我想保留错误数据的日志,仅插入已更正的错误数据。
我非常感谢您的帮助。
答案 0 :(得分:0)
首先,您应该知道,pandas允许您使用类似的东西直接从S3中读取
xyz = pd.read_csv('s3://bucket/file.csv, dtype={..}, encoding='latin-1')
但是,这不能解决您的不良数据问题。使用正则表达式定界符可能的python解析器引擎可以为您省钱,但似乎不太可能。
最简单的方法是逐行下载文件,然后将不良行放入另一个输出中
s3 = s3fs.S3FileSystem()
with s3.open('bucket/file.csv', 'rb') as fin:
with open('out_good.csv', 'wb') as fgood:
with open('out_bad.csv', 'wb') as fbad:
for line in fin:
if ':' in line or '`' in line:
fbad.write(line)
else:
fgood.write(line)
另一种选择是编写自己的类似文件的对象以读取行,进行文本解码并提供read()/ readline()方法供熊猫使用(我认为它还需要read()等) )。