【问题标题】:parse an input csv file with python to get an output sql file用python解析输入csv文件得到输出sql文件
【发布时间】:2013-02-25 10:52:21
【问题描述】:

基本上我希望在 Python 3.2 中执行的操作是读取包含 3 列的输入 csv 文件,然后创建一个 sql 输出文件,其中输入文件中每行中的 3 个数据将作为插入中的参数查询:

我的代码如下所示:

import os  
import csv  

InFileName = r'path\test.csv'  
OutFileName = r'path\test.sql'  
NumCommas = 0  

File = open(InFileName)  
for line in File:  
    if line.count(',') > NumCommas:  
        NumCommas = line.count(',')  
File.seek(0)  

reader = csv.reader(File)  
OutFile = open(OutFileName, 'w')  
for rows in reader:  
    OutFile.write("insert into table_name values(",rows[0],", 2, to_date(",   rows[1],",'YYYY-MM-DD'), 1, 1, -1, 0, ",rows[2],", ",rows[2],", 0, 0, 0, sysdate, 0);" +   '\n')  

OutFile.close()  
File.close()  

我得到了错误:

列表索引超出范围

【问题讨论】:

  • 只是一些python风格的指针: 1. TitleCase 应该只用于类名:变量应该是snake_case。 2. 使用“逗号空格”分隔函数的参数。
  • 哦,还有一件事:要非常非常小心使用可能来自用户的数据构造 SQL 查询。在这种情况下可能不是这样,但并不是一个真正要养成的好习惯。

标签: python csv python-3.x


【解决方案1】:

用你的代码

NumCommas = 0  

File = open(InFileName)  
for line in File:  
    if line.count(',') > NumCommas:  
        NumCommas = line.count(',')

您确定并记住输入文件所有行中一行中逗号的最大个数。之后,您甚至没有使用该信息来验证您的输入。

Jack 已经说明了这一点:验证您的输入:

for (lineno, row) in enumerate(reader):
    if len(row) >= 3:
        OutFile.write("insert into table_name values(",row[0],", 2, to_date(",   row[1],",'YYYY-MM-DD'), 1, 1, -1, 0, ",row[2],", ",row[2],", 0, 0, 0, sysdate, 0);" +   '\n')
    else:
        print("Line {0} does not contain at least three columns: {1}".format(lineno, row))

您实际上并不需要第一个循环来计算逗号。一般来说,文件 I/O 是任何计算应用程序的性能限制。如果没有必要,不要重复。

另外,一般来说,总是发布完整的错误消息。我确信 Python 为您提供了行号和代码行,这使这里的人们更容易提供帮助。

【讨论】:

    【解决方案2】:

    在您的rows in reader 块中记录rows。您可能在 csv 文件的末尾(或开头)只有一个空行。

    这意味着该行的 rows 数组将为空,rows[0]rows[2] 位是否会尝试访问该行不存在的列:

    for rows in reader:
        print rows # check yourself before you wreck yourself
    

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2018-02-28
      • 2014-08-11
      相关资源
      最近更新 更多