【问题标题】:Skip the first line of CSV file跳过 CSV 文件的第一行
【发布时间】:2014-10-02 14:32:13
【问题描述】:

我的 python 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.

编辑

我的行中有\n。我修改了我的代码,但我不希望我的解析器读取我的第一行

违规行如下所示:

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

感谢您的帮助!

【问题讨论】:

  • 我不知道为什么有人投票关闭它,恕我直言,我很好地记录了我的问题,令人讨厌的行为是我不想要这个错误..我希望我的 7 列被填满
  • 您应该考虑在 python 中使用 csv 模块,而不是自己手动解析。除此之外,在没有看到实际失败行的数据的情况下,我们几乎无能为力 - 自然的假设显然是无论出于何种原因,该行仅包含 6 个条目,或者您的解析器会导致这种情况发生。
  • 我的解析器对一切都很好,我刚刚创建了一个新的 CSV 并且发生了这种情况
  • 在执行 sql-insert 之前添加一个print len(vals)
  • 是的,我的行只有 6 列。我没有检测到错误,是否有可能,如果文本太长,python/sqlite 会拒绝它?

标签: python csv sqlite


【解决方案1】:

我认为问题出在您的 mysplit 函数中,某处(这个 if/elif 似乎很可疑)它返回一个包含 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()

【讨论】:

  • 文件“parsing.py”,第 16 行 for vals.replace('"', '') in data[1:]: SyntaxError: can't assign to function call
  • 很抱歉打扰您,我是 python 新手,但我遇到了一个新错误:文件“parseTry.py”,第 14 行,在 data = csv.reader(source, delimiter=' ;') NameError: name 'source' is not defined
  • '_csv.reader' object has no attribute 'getitem'哈哈又是一个错误,是我还是“不再测试”? :p
  • 嘿嘿抱歉,但我认为这是你..csv.reader(source, delimiter=';') 它正在我的机器上工作.. 听起来 csv 模块已损坏.. 请参阅此链接以获取有关 csv 模块的参考:docs.python.org/2/library/csv.html跨度>
【解决方案2】:

您的特殊问题可能在于 readline 函数,它会将包含换行符的较长文本分成两个条目/行/数据集,而不是一个! ;-)

解析 csv 的规范方法是使用 Hrabal 指出的 csvreader-module。

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 2018-06-12
    • 2014-04-12
    • 2020-12-15
    • 2012-06-09
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多