2017-01-20 2 views
0

ich Problem habe den folgenden Code mit einem großen (23.000 Datensätze, 10 Felder) laden Flughafencode CSV-Datei in eine Datenbank mit sqlalchemy:Python sqlalchemy große Datei Ausgabe

from numpy import genfromtxt 
from time import time 
from datetime import datetime 
from sqlalchemy import Column, Integer, Float, Date, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

def Load_Data(file_name): 
    f = lambda s: str(s) 
    data = genfromtxt(file_name, delimiter=',', skiprows=1, converters={0: f, 1:f, 2:f, 6:f, 7:f, 8:f, 9:f, 10:f}) 
    return data.tolist() 

Base = declarative_base() 

class AirportCode(Base): 
    #Tell SQLAlchemy what the table name is and if there's any table-specific arguments it should know about 
    __tablename__ = 'AirportCode' 
    __table_args__ = {'sqlite_autoincrement': True} 
    #tell SQLAlchemy the name of column and its attributes: 
    id = Column(Integer, primary_key=True, nullable=False) 
    ident = Column(String) 
    type = Column(String) 
    name = Column(String) 
    latitude_deg = Column(String) 
    longitude_deg = Column(String) 
    elevation_ft = Column(String) 
    continent = Column(String) 
    iso_country = Column(String) 
    iso_region = Column(String) 
    municipality = Column(String) 
    gps_code = Column(String) 


    def __repr__(self): 
     #return "<AirportCode(name='%s', municipality='%s')>\n" % (self.name, self.municipality) 
     return "name:{} municipality:{}\n".format(self.name, self.municipality) 

if __name__ == "__main__": 
    t = time() 

    #Create the database 
    engine = create_engine('sqlite:///airport-codes.db') 
    Base.metadata.create_all(engine) 

    #Create the session 
    session = sessionmaker() 
    session.configure(bind=engine) 
    s = session() 


    records_to_commit = 0 
    file_name = "airport-codes.csv"  #23,000 records fails at next line 
    #file_name = "airport-codes.alaska  250 records works fine" 
    print file_name #for debugging 
    data = Load_Data(file_name) # fails here on large files and triggers the except: below 
    print 'file loaded' #for debugging 

    for i in data: 
     records_to_commit += 1 


     record = AirportCode(**{ 

      'ident' : i[0].lower(), 
      'type' : i[1].lower(), 
      'name' : i[2].lower(), 
      'latitude_deg' : i[3], 
      'longitude_deg' : i[4], 
      'elevation_ft' : i[5], 
      'continent' : i[6], 
      'iso_country' : i[7], 
      'iso_region' : i[8], 
      'municipality' : i[9].lower(), 
      'gps_code' : i[10].lower() 


     }) 

     s.add(record) #Add all the records 

     #if records_to_commit == 1000: 
      #s.flush() #Attempt to commit batch of 1000 records 
      #records_to_commit = 0 
    s.commit() # flushes everything remaining + commits 

    s.close() #Close the connection 
    print "Time elapsed: " + str(time() - t) + " s." 

I angepasst diesen Code aus ein weiterer Beitrag in diesem Forum und es funktioniert gut, wenn ich eine Teilmenge der wichtigsten CSV-Datei (Alaska Flughäfen), die nur 250 Datensätze ist.

Wenn ich die gesamte Datenbank von 23.000 versuchen zeichnet das Programm nicht in dem Code in dieser Zeile laden:

data = Load_Data(file_name) 

ich auf einem Himbeer-pi 3

+1

Wie schlägt es fehl? Sie maskieren Fehler dort mit Ihrem blanken 'try/except' ... entfernen Sie diese und erhalten Sie eine korrekte Traceback - machen Sie eine' außer Ausnahme wie e: print e' zum Beispiel - Ich schätze, Sie bekommen ein AttributError/TypeError beim Versuch, einige Zeilen einzufügen, die nicht in den Testdaten vorkommen. –

+0

Bitte korrigieren Sie Ihre Identität - Sie haben wahrscheinlich nicht die Schaltfläche "{}" bei der Formatierung verwendet und nur die Zeilen in Zeile 0 gekennzeichnet, so dass alles als Code angezeigt wurde. Aber das ist Python ungültig – jsbueno

Antwort

0

Vielen Dank für die hilfreichen Kommentare arbeitete . Durch das Entfernen von try/except wurden die Probleme behoben. Es gab viele internationale Zeichen, zusätzliche Kommas in Feldern und Sonderzeichen usw., die das Problem beim Laden der Datei verursacht haben. Die Alaska Flughafen Einträge waren fehlerfrei, so dass es gut geladen.

Datenbank lädt jetzt 22.000 Datensätze in 32 Sekunden. Ich habe etwa 1000 Einträge gelöscht, da sie ausländische Einträge waren. Ich möchte, dass dies ein US-Flughafenverzeichnis ist.