Python 3.x csv.DictReader和Session.bulk\u是否保存对象?

Python 3.x csv.DictReader和Session.bulk\u是否保存对象?,python-3.x,csv,sqlalchemy,Python 3.x,Csv,Sqlalchemy,Python 3.8 w/SQLAlchemy 1.3(MySQL 8) 表定义: 在您询问之前,我无法提供csv,因为它包含敏感数据。它是一个“普通”csv文件,换行符为0x0A(\n)。以文本模式打开时,DictReader工作,但bulk\u save\u对象失败 首先,我从S3下载文件: def download_files(bucket, keys): filenames = [] for key in keys: filename = key

Python 3.8 w/SQLAlchemy 1.3(MySQL 8)

表定义:

在您询问之前,我无法提供csv,因为它包含敏感数据。它是一个“普通”csv文件,换行符为0x0A(\n)。以文本模式打开时,
DictReader
工作,但
bulk\u save\u对象
失败

首先,我从S3下载文件:

def download_files(bucket, keys):
    filenames = []
    for key in keys:
        filename = key.split('/')[-1]
        filenames.append(filename)
        with open(f'data/{filename}', mode='wb') as f:
            bucket.download_fileobj(key, f)
    return filenames
mode='wb'

TypeError: write() argument must be str, not bytes
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
然后,我解析文件并保存:

def parse_files(filenames):
    objects = []
    for filename in filenames:
        with open(f'data/{filename}', mode='rb') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                row['movie_studios'] = row['movie_studios'].strip('"[]')
                obj = Outbound(filename=filename, **row)
                objects.append(obj)
    session.bulk_save_objects(objects)
    session.commit()
使用
mode='rb'

TypeError: write() argument must be str, not bytes
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
没有
mode='rb'
[encoding='utf-8',]newline='

我试过io.TextIOWrapper:

with open(f'data/{filename}', mode='rb') as f:
    with io.TextIOWrapper(f, encoding='utf-8', newline='') as csvfile:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 30-33: character maps to <undefined>
打开(f'data/{filename}',mode='rb')作为f:
将io.TextIOWrapper(f,encoding='utf-8',newline='''作为csvfile:
UnicodeEncodeError:“charmap”编解码器无法对位置30-33中的字符进行编码:字符映射到
不足为奇

它似乎在这个角色上失败了:


如何解决此问题?

我将检查SQLAlchemy的连接编码,以确保其使用的是
utf-8
,而不是
asci
。例如,指定其在示例中显示的类似项:

e = create_engine(
    "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4")