2014-10-02 2 views
1

Я имею вопрос с моим питоном Csv парсером, и я не знаю, где ошибка происходит:Пропустить первую строку CSV файл

Так что это мой питон:

# -*-coding:Utf-8 -*                                               

import sqlite3; 
from datetime import datetime, date; 

conn = sqlite3.connect('info_max.sqlite3') 
conn.text_factory = str 
c = conn.cursor() 
c.execute('drop table if exists info_max') 
c.execute('create table info_max(id_huiles text, name_fr text, name_ln text, img text, mode_obt text, bien_vertus text, bio text)') 

def mysplit(string): 
    quote = False 
    retval = [] 
    current = "" 
    for char in string: 
     if char == '"': 
      quote = not quote 
     elif char == ',' and not quote: 
      retval.append(current) 
      current = "" 
     else: 
      current += char 
    retval.append(current) 
    return retval 

# Lit de ligne en ligne, en sautant la première ligne                                      
rawdata = open("info_max_try.csv", "r").read() 
data = rawdata.split("\n", 1)[1:] 
data = re.split('"END"', rawdata) 
print(data) 
for entry in data: 
    # Parse les valeurs                                              
    vals = mysplit(entry.strip()) 
    # Convertit les strings format heure au format standard sqlite3                                   
    # Insert la ligne                                              
    vals[0] = int(vals[0]) 
    print "Inserting %s..." %(vals[0]) 
    print "The enrty is : %s" %entry 
    sql = "insert into info_max values(?, ?, ?, ?, ?, ?, ?)" 
    c.execute(sql, vals) 

# Done !                                                  
conn.commit() 

Моих .csv выглядит следующим образом:

"id_huiles","name_fr", "name_ln", "img",   "mode_obt", "bien_vertus","bio" 
"77",  "Basilic", "Basilium", "Basilic.png", "some_text", "some_text", "0" 
... 

И я получил эту ошибку после того, как 3 записей:

File "parseAromaHuile.py", line 39, in <module> 
    c.execute(sql, vals) 
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 7, and there are 6 supplied. 

EDIT

Мои строки были \n в них .. Я доработан мой код, но я не хочу, чтобы мой парсер, чтобы прочитать мою первую строку

Нарушитель линия выглядит следующим образом:

"6","Bergamote", "Citrus bergamis L.", "bergamote.png", "some_text", "some_text\n other_text\n more_text","0" 

Спасибо за помощь!

+0

Я не знаю, почему кто-то проголосовал за его закрытие, у меня есть ИМХО, хорошо документированный мой вопрос, поведенческое поведение - я не хочу эту ошибку. Я хочу, чтобы мои 7 столбцов были заполнены –

+2

Вам следует рассмотреть возможность использования csv-module в python, вместо того, чтобы вручную разбирать вещи. Помимо этого, не видя данных фактической линии неудачи, мало что можно сделать - естественное предположение очевидно, что по какой-либо причине эта строка содержит только 6 записей, или ваш парсер делает это. – deets

+0

Мой парсер отлично работает для всего, я только что создал новый CSV, и это происходит –

ответ

1

Я думаю, что проблема в вашей mysplit функции, где-то (это, если/Элиф кажется подозреваемым) возвращает список из 6 элементов вместо 7.

Попробуйте это:

import sqlite3; 
import csv 
from datetime import datetime, date; 

conn = sqlite3.connect('info_max.sqlite3') 
conn.text_factory = str 
c = conn.cursor() 
c.execute('drop table if exists info_max') 
c.execute('create table info_max(id_huiles text, name_fr text, name_ln text, img text, mode_obt text, bien_vertus text, bio text)') 


with open('info_max.csv','rb') as source: 
    #I use csv reader instead of writing my own 
    data = csv.reader(source, delimiter=';') 
    header = data.next() 
    for vals in data: 
     for val in vals: 
      #I use replace function to get rid of qoutes 
      val.replace('"', '') 
     #adds the string "missing data" if some column is missing in your source 
     if len(vals) < 6: 
      vals += ['missing data' for i in range(0,6-len(vals))]                                              
     vals[0] = int(vals[0]) 
     print "Inserting %s..." %(vals[0]) 
     print "The enrty is : %s" %vals 
     sql = "insert into info_max values(?, ?, ?, ?, ?, ?, ?)" 
     c.execute(sql, vals) 

conn.commit() 
+0

Файл «parsing.py», строка 16 для vals.replace ('' ',' ') в данных [1:]: SyntaxError: не может назначить вызов функции –

+0

Получил ошибку^ –

+0

извините, не проверен код. Я отредактировал исправление – Hrabal

0

Ваш своеобразно проблема может заключаться в функции readline, которая разбивала бы более длинный текст, содержащий новые строки, на две записи/строки/наборы данных вместо одного! ;-)

Канонический способ разбора csv состоял бы в использовании модуля csvreader, как указано Hrabal.

Смежные вопросы