使用Python CSV模块使用BOM读取UTF-8会导致不必要的额外字符

And*_*ers 12 python csv byte-order-mark character-encoding python-2.7

我试图用Python读取一个CSV文件,代码如下:

with open("example.txt") as f:
   c = csv.reader(f)
   for row in c:
      print row
Run Code Online (Sandbox Code Playgroud)

example.txt只有以下内容:

Hello world!

对于UTF-8或ANSI编码文件,这给了我预期的输出:

> ["Hello world!"]
Run Code Online (Sandbox Code Playgroud)

但是,如果我将文件保存为带有BOM的UTF-8,我会得到以下输出:

> ["\xef\xbb\xbfHello world!"]
Run Code Online (Sandbox Code Playgroud)

由于我无法控制用户将用作输入的文件,因此我希望这也适用于BOM.我该如何解决这个问题?有什么我需要做的,以确保这也适用于其他编码?

Mar*_*ans 6

您可以使用unicodecsvPython模块,如下所示:

import unicodecsv

with open('input.csv', 'rb') as f_input:
    csv_reader = unicodecsv.reader(f_input, encoding='utf-8-sig')
    print list(csv_reader)
Run Code Online (Sandbox Code Playgroud)

因此,对于包含带有BOM的UTF-8中的以下内容的输入文件:

c1,c2,c3,c4,c5,c6,c7,c8
1,2,3,4,5,6,7,8
Run Code Online (Sandbox Code Playgroud)

它会显示以下内容:

[[u'c1', u'c2', u'c3', u'c4', u'c5', u'c6', u'c7', u'c8'], [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8']]
Run Code Online (Sandbox Code Playgroud)

  • 实际上,我会使用错误的编码,如上所述`utf-8-sig`应该使用. (3认同)