首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python不能将csv解析为list ( utf-8 bom )

python不能将csv解析为list ( utf-8 bom )
EN

Stack Overflow用户
提问于 2022-08-10 14:46:33
回答 1查看 171关注 0票数 0

编辑:此问题仅适用于txt文件的 ,并不解决csv文件的问题。

我有两个csv文件

代码语言:javascript
运行
复制
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-8utf-8-sig,但它只以字符串的形式读取每一行的逗号分隔值。我不能用逗号分隔,因为我将有列值,其中包括逗号。

我的python代码正确地读取rtc-test.csv中的值列表。当csv使用utf-8与bom一起编码时,我如何在ads-test.csv中读取值列表?

代码:

代码语言:javascript
运行
复制
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')

控制台输出:

代码语言:javascript
运行
复制
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文件?

EN

回答 1

Stack Overflow用户

发布于 2022-08-10 15:16:46

您的CSV是用UTF-8 (默认值)而不是UTF-16编码的,因此将其作为编码传递:

代码语言:javascript
运行
复制
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,供参考:

代码语言:javascript
运行
复制
Title,State,Work Item Type,ID,12NC
"453560751251 TOOL, SQ-59 CORNER CLAMP","To Do","FRUPS","6034","453560751251"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73308352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档