Подтвердить что ты не робот

Как создать файл 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)

Этот код оставляет меня открытым и без заголовков. Также не можете понять, как использовать файл как журнал.

4b9b3361

Ответ 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)

Это более прямо и работает все время.