Python 3.x csv.DictReader和Session.bulk\u是否保存对象?
Python 3.8 w/SQLAlchemy 1.3(MySQL 8)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
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")