4

読み込む必要がある 1048 行の csv データがあります。データは次のようになります。

\N,Olenevka,Оленевка,2596
\N,Urzuf,Урзуф,2904
\N,Lebedyn,ЛЕБЕДИН,27695
\N,Staryy Dobrotvor,Staryy Dobrotvor,6436

ここに表があります:

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| city_id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name       | text             | YES  |     | NULL    |                |
| alt_name   | text             | YES  |     | NULL    |                |
| population | int(10) unsigned | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

コードは次のとおりです。

db.query(""" 
    LOAD DATA INFILE '%s' 
    INTO TABLE %s 
    CHARACTER SET utf8
    FIELDS TERMINATED BY ',' 
    (@skip, name, alt_name, population) 
    """ % (temp_file, table))

class Database(object):
    def __init__(self, database):
        self.database = database
    def query(self, cmd):
        return subprocess.call(['mysql -u root -e "%s" %s' % (cmd, self.database)], shell=True)

Python からコマンドを発行すると、1025 行しか読み取れません。しかし、mysql プロンプトから同じコマンドを発行すると、それらすべてが取得されます。

コードを実行した後の SELECT * の最後の行は次のとおりです。

|    1023 | Alchevs’k        | Алчевск                             |     116000 |
|    1024 | Yakymivka        | Якимівка                            |      12353 |
|    1025 | Okhtyrka         | Охтирка                             |      49818 |
|    1026 | Adzhamka         | А                                   |          0 |
+---------+------------------+-------------------------------------+------------+

最後の行は部分的にしか読み取られません。これが残りのファイルです。

\N,Okhtyrka,Охтирка,49818
\N,Adzhamka,Аджамка,3859
\N,Malynivka,Малинівка,7502
\N,Mykhaylivka,Mykhaylivka,3352
\N,Kopashnovo,Копашново,3010
\N,Narkevychi,Наркевичі,1631
\N,Kirove,Кірове,3291
\N,Orikhove,Оріхове,3000
\N,Krasni Okny,Красні Окни,5461
\N,Pavlivka,Pavlovka,738
\N,Kuchurhan,Кучурган,3183
\N,Smyga,Смыга,2800
\N,Tayirove,Таїрове,1849
\N,Teplodar,Теплодар,8502
\N,Komsomolsk,Комсомольськ,51740
\N,Славутич,Славутич,25000
\N,Розгирче,Розгирче,566
\N,Orzhiv,Оржів,4125
\N,Shkil’ne,Шкільне,2127
\N,Denyshi,Деныши,1164
\N,Chetfalva,Четфалва,755
\N,Stepove,Степовое,1549
\N,Scholkine,,11677
\N,Yuzhnoukrains'k,Южноукраїнськ,39430

アイデア?

4

1 に答える 1

0

次のように、各行の最後にバックスラッシュを入れてみてください。

db.query("""\
    LOAD DATA INFILE '%s' \
    INTO TABLE %s \
    CHARACTER SET utf8 \
    FIELDS TERMINATED BY ',' \
    (null, name, alt_name, population) \
    """ % (temp_file, table))

それでもうまくいかない場合は、「subprocess.call」呼び出しからシェル処理を無効にしてみてください。

例えば:

シェル=偽

于 2012-07-03T17:56:30.683 に答える