这个python脚本可以缩短/优化,怎么样?

时间:2009-12-18 02:55:56

标签: python

我不习惯以python的方式做事,但我几乎可以肯定下面的脚本可以被压缩。我不是在寻找速度优化,我正在寻找更易读的代码。对我所关心的所有内容都要慢一些,但有什么方法可以让它看起来更像Python。

我只是在一个填充了zipcodes的csv文件中读取并填充了一个包含23列的数据库。很多打字。我也不喜欢像行的索引这样的硬编码。此外,multis ='%s,'* 23后跟multis = multis [: - 2]感觉很脏。

期待看到你们中的一些人能想出来。

#!/usr/bin/python

import csv
import MySQLdb

db = MySQLdb.connect(host="localhost", user="root", db="test")
c = db.cursor()
f_csv = 'zip-codes-database-STANDARD.csv'
csvReader = csv.reader(open(f_csv))
ziplist = []
multis = '%s, '*23
multis = multis[:-2]
for row in csvReader:
    c.execute("""INSERT INTO lock_zipcodes_complete 
            (`zipcode`, `city`, `state`, `county`, `areacode`,
            `citytype`, `city_alias_abbreviation`,
            `city_alias_name`, `latitude`, `longitude`, `timezone`,
            `elevation`, `county_fips`, `dst`,
            `preferred_last_line_key`, `classification_code`,
            `multicounty`, `state_fips`, `city_state_key`,
            `city_alias_code`, `primary_record`, `city_mixed_case`,
            `city_alias_mixed_case`) VALUES(""" + multis + ')',
            (row[0], row[1], row[2], row[3], row[4], row[5], row[6],
            row[7], row[8], row[9], row[10], row[11], row[12],
            row[13], row[14], row[15], row[16], row[17], row[18],
            row[19], row[20], row[21], row[22]))

2 个答案:

答案 0 :(得分:7)

这部分:

multis = '%s, '*23
multis = multis[:-2]

应该是

multis = ', '.join(['%s'] * 23)

ziplist未使用,因此您只需删除设置它的行。

            (row[0], row[1], row[2], row[3], row[4], row[5], row[6],
            row[7], row[8], row[9], row[10], row[11], row[12],
            row[13], row[14], row[15], row[16], row[17], row[18],
            row[19], row[20], row[21], row[22])

应该只是tuple(row)(对于您使用它的具体方式,只需row即可。)

INSERT中明确的列名列表令人不快,但如果您不确定该数据库表中的所有列是否正确(或者当然,如果您是确定要么不是这种情况);但这是一个SQL - vs - CSV“阻碍不匹配”问题而不是Python问题; - )。

整个循环:

for row in csvReader:
  c.execute(sql_statement, row)

可以选择进一步压缩为:

c.executemany(sql_statement, csvReader)

答案 1 :(得分:3)

请不要像这样构建SQL文本。请不要。请。

首先。不使用变量ziplist。删除它。

二。使用真正的SQL绑定。

c.execute( "INSERT...", row )

这在MySQLdb界面中有记录。 http://mysql-python.sourceforge.net/MySQLdb-1.2.2/