Python读取CSV导入DynamoDB时,如何忽略单元格内的逗号?
解决CSV单元格含逗号时的列分割问题
嘿,这个问题我之前处理CSV导入的时候也踩过坑!你现在应该是在手动用逗号分割每行数据吧?这就会把description字段里的逗号当成列分隔符,导致列数不对、数据错位。其实Python标准库的csv模块已经原生支持处理这种情况了,它会自动识别被引号包裹的单元格,忽略里面的分隔符。
修正后的代码示例
我们把读取CSV的逻辑换成csv.DictReader(它能直接把每行映射成字典,和你的col_names、column_types适配起来更方便):
import csv import boto def import_csv_to_dynamodb(table_name, csv_file_name, col_names, column_types): ''' Import a CSV file to a DynamoDB table ''' dynamodb_conn = boto.connect_dynamodb(aws_access_key_id=YOUR_ACCESS_KEY, aws_secret_access_key=YOUR_SECRET_KEY) table = dynamodb_conn.get_table(table_name) # 用csv.DictReader处理带引号的单元格,自动忽略单元格内的逗号 with open(csv_file_name, 'r', encoding='utf-8') as csv_file: # 如果你的CSV第一行是表头,就不用指定fieldnames;如果没有表头,就传fieldnames=col_names reader = csv.DictReader(csv_file, fieldnames=col_names) # 跳过CSV自带的表头行(如果你的CSV没有表头,就删掉这一行) next(reader, None) for row in reader: # 根据column_types转换对应列的数据类型 item = {} for col, dtype in zip(col_names, column_types): item[col] = dtype(row[col]) # 写入DynamoDB表 table.put_item(data=item)
关键原理说明
- 按照CSV的规范,当单元格内容包含分隔符(比如逗号)时,会用双引号把整个单元格包裹起来,比如:
id,description,price→1,"This is a test, with commas",10 csv模块的reader和DictReader会自动识别这种格式,不会把引号内的逗号当成列分隔符,完美解决你的字段分割错误问题。
额外配置(按需调整)
如果你的CSV用了其他引号字符(比如单引号)或者自定义分隔符,可以在初始化DictReader的时候指定参数:
reader = csv.DictReader( csv_file, fieldnames=col_names, delimiter=',', # 你的列分隔符 quotechar="'", # 包裹含分隔符单元格的字符(比如单引号) quoting=csv.QUOTE_ALL# 可选,指定哪些单元格需要被引号包裹 )
这样修改后,description字段里的逗号就不会被误分割啦,导入DynamoDB的数据也会是正确的。
内容的提问来源于stack exchange,提问作者Will Simpson
相关产品推荐
相关产品推荐

