通过csv逐字符遍历

问题描述:

我目前正在做一个练习,构建一个python CSV解析器。我需要能够打开一个CSV文件并读取内容,逐个字符地遍历CSV。我的python代码设置为遍历字符串,但是我遇到了通过CSV执行此操作的错误。通过csv逐字符遍历

Read方法:

import csv 
def parse(csv): 
    #states 
    is_token = False 
    previous_character_is_escape = False 
    no_quote_value = False 

    csv_file = open(csv, 'r') 
    iterator = (csv.reader(csv_file)) 

    for i in iterator: 
     if is_token == False: 
      if i == '"': 
       print '\b' + i, 
       is_token = True 
       no_quote_value = False 
      elif i == ',': 
       print '\n', 
      elif no_quote_value == True: 
       print '\b' + i, 
       is_token = True 
      else: 
       print '\b' + i, 


     elif is_token == True: 
      if i == '\\': 
       print '\b' + i, 
       previous_character_is_escape = True 
      elif previous_character_is_escape == True and i == '"': 
       print '\b' + i, 
       previous_character_is_escape = False 
      elif previous_character_is_escape == False and i == '"': 
       print '\b' + i, 
       is_token = False 
       no_quote_value = True 
      elif no_quote_value == True and i == ',': 
       print '\n', 
       is_token = False 
      elif no_quote_value == False and i == ',': 
       print '\b' + i, 
      else: 
       print '\b' + i, 

parse('example.csv') 

当我执行此我得到以下错误:

Traceback (most recent call last): 
    File "main_test.py", line 47, in <module> 
    parse('example.csv') 
    File "main_test.py", line 10, in parse 
    iterator = (csv.reader(csv_file)) 
AttributeError: 'str' object has no attribute 'reader' 

有什么办法由字符打开一个CSV文件并读取内容字符?

+3

嗯,你不能只是打开它作为一个普通的文本文件?如果你想逐字读字符,你不应该关心csv模块 – cedbeu

+4

你的变量叫'csv'与模块名'csv'冲突。改变它不同的东西。 –

+1

这就是错误的原因,但是@cedbeu说,如果你想自己解析它,你不应该使用'csv'。 –

一个基本上是文本文件的CSV文件,我会说你应该把它看作一个普通的文本文件......换句话说,如果你想构建自己的解析器,你不应该使用现有的解析器。 ..

with open(filename) as f: 
    for l in f: 
     for c in l: 
      pass # your c-by-c processing here 

注意,在“逗号分隔值”常规列分隔符(CSV)格式是逗号......但是,有时(大部分的实际时间),它是一个标签,半-colon或其他一些字符...在解析时注意这一点...关于行,“行尾字符”(EOL)取决于文件的编码(* nix上的标准是\n,在Mac上是\r,在Windows上是\r\n

+0

谢谢@cedbue这为我工作!感谢您的意见。当我构建我自己的解析器时,尝试使用csv模块真是太愚蠢了! – Paul

这可能是因为您将参数csv命名为参数csv,这会将计算机与csv模块混淆,更改其他名称并再次尝试。