2016-03-05 187 views
1

我目前正在做一個練習,構建一個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'。 –

回答

2

一個基本上是文本文件的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

0

這可能是因爲您將參數csv命名爲參數csv,這會將計算機與csv模塊混淆,更改其他名稱並再次嘗試。