编辑:此问题仅适用于txt文件的 ,并不解决csv文件的问题。
我有两个csv文件
rtc_csv_file="csv_migration\\rtc-test.csv"
ads_csv_file="csv_migration\\ads-test.csv"
下面是ads-test.csv文件(这会导致问题),https://easyupload.io/bk1krp文件是UTF-8 with BOM
,是vscode右下角在打开csv时说的。
我正在尝试编写python函数来读取每一行,并将其转换为dict对象。
我的函数对于第一个文件rtc-test.csv
很好,但是对于第二个文件ads-test.csv
,当我使用utf-16
时会得到一个错误UTF-16 stream does not start with BOM
。因此,我尝试使用utf-8
和utf-8-sig
,但它只以字符串的形式读取每一行的逗号分隔值。我不能用逗号分隔,因为我将有列值,其中包括逗号。
我的python代码正确地读取rtc-test.csv中的值列表。当csv使用utf-8与bom一起编码时,我如何在ads-test.csv中读取值列表?
代码:
rtc_csv_file="csv_migration\\rtc-test.csv"
ads_csv_file="csv_migration\\ads-test.csv"
from csv import reader
import csv
# read in csv, convert to map organized by 'id' as index root parent value
def read_csv_as_map(csv_filename, id_format, encodingVar):
print('filename: '+csv_filename+', id_format: '+id_format+', encoding: '+encodingVar)
dict={}
dict['rows']={}
try:
with open(csv_filename, 'r', encoding=encodingVar) as read_obj:
csv_reader = reader(read_obj, delimiter='\t')
csv_cols = None
for row in csv_reader:
if csv_cols is None:
csv_cols = row
dict['csv_cols']=csv_cols
print('csv_cols=',csv_cols)
else:
row_id_val = row[csv_cols.index(str(id_format))]
print('row_id_val=',row_id_val)
dict['rows'][row_id_val] = row
print('done')
return dict
except Exception as e:
print('err=',e)
return {}
rtc_dict = read_csv_as_map(rtc_csv_file, 'Id', 'utf-16')
ads_dict = read_csv_as_map(ads_csv_file, 'ID', 'utf-16')
控制台输出:
filename: csv_migration\rtc-test.csv, id_format: Id, encoding: utf-16
csv_cols= ['Summary', 'Status', 'Type', 'Id', '12NC']
row_id_val= 262998
done
filename: csv_migration\ads-test.csv, id_format: ID, encoding: utf-16
err= UTF-16 stream does not start with BOM
如果我尝试使用utf-16-le
,则会得到不同的错误'utf-16-le' codec can't decode byte 0x22 in position 0: truncated data
。
如果我尝试使用utf-16-be
,就会得到以下错误:'utf-16-be' codec can't decode byte 0x22 in position 0: truncated data
为什么我的python代码不能读取这个csv文件?
发布于 2022-08-10 15:16:46
您的CSV是用UTF-8 (默认值)而不是UTF-16编码的,因此将其作为编码传递:
ads_csv_file="ads-test.csv"
from csv import reader
# read in csv, convert to map organized by 'id' as index root parent value
def read_csv_as_map(csv_filename, id_format, encodingVar):
print('filename: '+csv_filename+', id_format: '+id_format+', encoding: '+encodingVar)
dict={}
dict['rows']={}
try:
with open(csv_filename, 'r', encoding=encodingVar) as read_obj:
csv_reader = reader(read_obj, delimiter='\t')
csv_cols = None
for row in csv_reader:
if csv_cols is None:
csv_cols = row
dict['csv_cols']=csv_cols
print('csv_cols=',csv_cols)
else:
row_id_val = row[csv_cols.index(str(id_format))]
print('row_id_val=',row_id_val)
dict['rows'][row_id_val] = row
print('done')
return dict
except Exception as e:
print('err=',e)
return {}
ads_dict = read_csv_as_map(ads_csv_file, 'ID', 'utf-8') # <- updated here
下面是CSV,供参考:
Title,State,Work Item Type,ID,12NC
"453560751251 TOOL, SQ-59 CORNER CLAMP","To Do","FRUPS","6034","453560751251"
https://stackoverflow.com/questions/73308352
复制相似问题