2016-03-20 9 views
2

Ben pypydobc kullanarak csv dosyaya MS Access veritabanı bir tablo ihraç etmeye çalışıyorlar 200.000 satır yazdırmak için yaklaşık 5 dakika alıyor. fetchone daha hızlıysa, sonuçları bir csv dosyasına yazmış olabilirdim, ancak çok uzun sürüyor.MS Access tablosunu Python'daki bir csv dosyasına aktarma. <em>fetchone</em> işlevini kullanarak örneğin sonsuza alıyor - pypyodbc

Ayrıca
import pypyodbc 
pypyodbc.lowercase = False 
conn = pypyodbc.connect(
    r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" + 
    r"Dbq=C:\temp\Temp_DB.accdb;") 
cur = conn.cursor() 
cur.execute("SELECT Column1, Column2, FROM Table1"); 
Col1 = [] 
Col2 = [] 
row = cur.fetchone() 
while row is not None: 
    print(row) 
    row = cur.fetchone() 
    Col1.append(row.get("Column1")) 
    Col2.append(row.get("Column2")) 
cur.close() 
conn.close() 

, şimdiye kadar başarısız olmuştur pypyodbc tüm işlevleri üzerinde bir belge vardır: Bu defa denedim nedir?

cevap

2

(süreç zaman kazanmak için print uzak durarak ve düşünün) bireysel listelere eklenecek gerek kalmadan cur.fetchall() ve csv modülü doğrudan çıkış sorgu sonuçları kullanmayı düşünün:

import pypyodbc 
import csv 

# MS ACCESS DB CONNECTION 
pypyodbc.lowercase = False 
conn = pypyodbc.connect(
    r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" + 
    r"Dbq=C:\temp\Temp_DB.accdb;") 

# OPEN CURSOR AND EXECUTE SQL 
cur = conn.cursor() 
cur.execute("SELECT Column1, Column2, FROM Table1"); 

# OPEN CSV AND ITERATE THROUGH RESULTS 
with open('Output.csv', 'w', newline='') as f: 
    writer = csv.writer(f)  
    for row in cur.fetchall() : 
     writer.writerow(row) 

cur.close() 
conn.close() 

Kenara - Eğer yukarıda Jet/ACE SQL Engine'e bağlanma (MSAccess.exe'nin bir nesnesi olan ve programla sınırlı olmayan, ancak tüm Office/Windows programlarında kullanılabilen - MS Access'in bir veritabanı olduğunu düşünen yanlış addır ancak aslında bir GUI konsolu için bir Alternativ csv dışa aktarımınız için ely, GUI uygulaması ile etkileşime girebilir ve tablo/sorguları ayrılmış metinlere dışa aktarmak için Access 'TransferText() yöntemini çalıştırabilirsiniz. Ve Python veritabanını açabilir ve win32com modülü ile dışa aktarma yöntemini çağırabilir:

import win32com.client 

# OPEN ACCESS APP AND DATABASE 
oApp = win32com.client.Dispatch("Access.Application") 
oApp.OpenCurrentDatabase('C:\temp\Temp_DB.accdb') 

# EXPORT TABLE TO CSV 
acExportDelim = 2 
oApp.DoCmd.TransferText(acExportDelim, None, "Table1", 'Output.csv'), True) 

oApp.DoCmd.CloseDatabase 
oApp.Quit 
oApp = None 
İlgili konular