2013-04-17 42 views
0

所以我试图打开并阅读没有字段名称的csv文件。根据我所做的研究,我很确定它是用UTF-8编码的。我的CSV有这样的格式:没有字段名称CSV阅读器Python UTF-8

1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 

我使用以下方法来打开并阅读:

def parseCSVCounter(csv_file): 

with codecs.open(csv_file, "r", "utf-8-sig","strict", -1) as f: 
    f = str(f) 
    relayreader = csv.reader(f, delimiter=',') 
    for row in relayreader: 
     print(row) 

     try: 
      #row[0] = unicode(row[0], 'latin-1') 
      counter(row) 
      print('starting row..') 

     except UnicodeDecodeError, e: 
      print('something went wrong1') 
      print e 

     except Exception, e: 
      print('something went wrong') 
      print e 

这产生

Starting Command.. 
['<'] 
something went wrong 
invalid literal for int() with base 10: '<' 
['o'] 
something went wrong 
invalid literal for int() with base 10: 'o' 
........ 
starting row.. 
['9'] 
starting row.. 
['3'] 
starting row.. 
['8'] 
starting row.. 
['2'] 
starting row.. 
['8'] 
starting row.. 
['>'] 
something went wrong 
invalid literal for int() with base 10: '>'` 

我剪下来,以证明我的观点。它似乎为我自动生成字段名称。用csv.DictReader(fieldnames = 'foo')我可以在一个序列中指定字段名称。我如何得到csv.reader()忽略字段名称的缺乏?

+0

'>>> X =打开( 'AAA', 'W')'' >>> STR(x)的'' “<打开文件 'AAA',模式 'W' 在0x01FC9860>”' – jamylak

回答

3

你做不是需要打电话str(f);使用文件对象直接

with codecs.open(csv_file, "r", "utf-8-sig", "strict") as f: 
    relayreader = csv.reader(f, delimiter=',') 

你想读的str(f)输出为CSV文件,而不是,这是形式的字符串:

<open file '/path/to/file', mode 'rb' at 0x105f10d20> 

你可以看到,从你的错误输出;它是拼写出<,o等一路到内存地址的数字,并关闭>

注意,utf-8-sig编解码器可以处理UTF-8编码BOM出席文件的开始,但除非该BOM预期存在,正常UTF-8编解码器会做得很好。