этот скрипт Python может быть сокращен / оптимизирован, как? - PullRequest
1 голос
/ 18 декабря 2009

Я еще не привык делать вещи на языке Python, но я почти уверен, что следующий скрипт может быть сжат. Я не ищу оптимизации скорости, я ищу более читаемый код. Делайте это медленнее, мне все равно, но каковы некоторые способы сделать этот вид более похожим на Python.

Я просто читаю в 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 ]

7 голосов
/ 18 декабря 2009

Эта часть:

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)
3 голосов
/ 18 декабря 2009

Пожалуйста, не создавайте текст SQL таким образом. Пожалуйста, не надо. Пожалуйста.

Во-первых. Переменная ziplist не используется. Удалить его.

Во-вторых. Использовать реальную привязку SQL.

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

Это задокументировано в интерфейсе MySQLdb. http://mysql -python.sourceforge.net / MySQLdb-1.2.2 / .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...