Как создать файл CSV из базы данных в Python?
У меня есть таблица Sqlite 3 и/или MySQL с именем "клиенты".
Использование python 2.6, Как создать файл csv с именем Clients100914.csv с заголовками?
Превосходный диалект...
Выполнение Sql: select * дает только данные таблицы, но я хотел бы заполнить таблицу заголовками.
Как создать набор записей для получения заголовков таблиц. Заголовки таблиц должны поступать непосредственно из sql, не написанного на python.
w = csv.writer(open(Fn,'wb'),dialect='excel')
#w.writelines("header_row")
#Fetch into sqld
w.writerows(sqld)
Этот код оставляет меня открытым и без заголовков. Также не можете понять, как использовать файл как журнал.
Ответы
Ответ 1
import csv
import sqlite3
from glob import glob; from os.path import expanduser
conn = sqlite3.connect( # open "places.sqlite" from one of the Firefox profiles
glob(expanduser('~/.mozilla/firefox/*/places.sqlite'))[0]
)
cursor = conn.cursor()
cursor.execute("select * from moz_places;")
#with open("out.csv", "w", newline='') as csv_file: # Python 3 version
with open("out.csv", "wb") as csv_file: # Python 2 version
csv_writer = csv.writer(csv_file)
csv_writer.writerow([i[0] for i in cursor.description]) # write headers
csv_writer.writerows(cursor)
PEP 249 (DB API 2.0) содержит дополнительную информацию о cursor.description
.
Ответ 2
Использование модуля csv очень прямолинейно и сделано для этой задачи.
import csv
writer = csv.writer(open("out.csv", 'w'))
writer.writerow(['name', 'address', 'phone', 'etc'])
writer.writerow(['bob', '2 main st', '703', 'yada'])
writer.writerow(['mary', '3 main st', '704', 'yada'])
Создает именно тот формат, который вы ожидаете.
Ответ 3
Вы можете легко создать его вручную, записав файл с выбранным разделителем. Вы также можете использовать CSV-модуль.
Если это из базы данных, вы можете просто использовать запрос из вашего клиента sqlite:
sqlite <db params> < queryfile.sql > output.csv
Который создаст CSV файл с разделителем табуляции.
Ответ 4
Как извлечь заголовки столбцов из существующей таблицы:
Вам не нужно анализировать инструкцию SQL create. Это удачно, так как синтаксис "create table" не является ни хорошим, ни чистым, он ужасно уродливый.
Вы можете использовать table_info
прагма. Это дает вам полезную информацию о каждом столбце в таблице, включая имя столбца.
Пример:
>>> #coding: ascii
... import sqlite3
>>>
>>> def get_col_names(cursor, table_name):
... results = cursor.execute("PRAGMA table_info(%s);" % table_name)
... return [row[1] for row in results]
...
>>> def wrong_way(cur, table):
... import re
... cur.execute("SELECT sql FROM sqlite_master WHERE name=?;", (table, ))
... sql = cur.fetchone()[0]
... column_defs = re.findall("[(](.*)[)]", sql)[0]
... first_words = (line.split()[0].strip() for line in column_defs.split(','))
... columns = [word for word in first_words if word.upper() != "CONSTRAINT"]
... return columns
...
>>> conn = sqlite3.connect(":memory:")
>>> curs = conn.cursor()
>>> _ignored = curs.execute(
... "create table foo (id integer, name text, [haha gotcha] text);"
... )
>>> print get_col_names(curs, "foo")
[u'id', u'name', u'haha gotcha']
>>> print wrong_way(curs, "foo")
[u'id', u'name', u'[haha'] <<<<<===== WHOOPS!
>>>
Другие проблемы с теперь удаленным ответом "parse the create table SQL":
-
Вещи с помощью, например, create table test (id1 text, id2 int, msg text, primary key(id1, id2))
... необходимо игнорировать не только CONSTRAINT
, но также ключевые слова PRIMARY
, UNIQUE
, CHECK
и FOREIGN
(см. create table
docs).
-
Нужно указать re.DOTALL
, если в SQL есть новые строки.
-
В line.split()[0].strip()
strip
является избыточным.
Ответ 5
Это просто и отлично работает для меня.
Допустим, вы уже подключились к вашей таблице базы данных, а также получили объект курсора. Итак, следуйте дальше с этого момента.
import csv
curs = conn.cursor()
curs.execute("select * from oders")
m_dict = list(curs.fetchall())
with open("mycsvfile.csv", "wb") as f:
w = csv.DictWriter(f, m_dict[0].keys())
w.writerow(dict((fn,fn) for fn in m_dict[0].keys()))
w.writerows(m_dict)
Ответ 6
Если я чего-то не хватает, вы просто хотите сделать что-то вроде этого...
f = open("somefile.csv")
f.writelines("header_row")
для записи строк в файл (вам может понадобиться упорядочить значения и добавить комм или каналы и т.д.)
f.close()
Ответ 7
Вы, кажется, знакомы с excel и хотите оставаться рядом с ним. Могу я предложить попробовать PyExcelerator?
Ответ 8
Это легко сделать с помощью панд и sqlite3. В продолжение ответа от Кристиана Чиупиту.
import sqlite3
from glob import glob; from os.path import expanduser
conn = sqlite3.connect(glob(expanduser('data/clients_data.sqlite'))[0])
cursor = conn.cursor()
Теперь используйте панд, чтобы прочитать таблицу и написать в csv.
clients = pd.read_sql('SELECT * FROM clients' ,conn)
clients.to_csv('data/Clients100914.csv', index=False)
Это более прямо и работает все время.