指定dtype时,Python熊猫read_csv问题数据不正确

时间:2018-07-20 21:05:45

标签: python pandas amazon-s3

我正在使用熊猫“ 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文件中的所有记录来重定向临时列表中的这些不良行?我想保留错误数据的日志,仅插入已更正的错误数据。

我非常感谢您的帮助。

1 个答案:

答案 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()等) )。