Python csv_writer: изменить формат вывода столбца даты оракула - PullRequest
0 голосов
/ 15 мая 2018

У меня есть таблица со столбцом даты, и я хочу отформатировать этот столбец в формате DD.MM.YYYYY в файле CSV, но изменение сеанса не влияет на Python CSV_writer.

Есть ли способ обработки всехстолбцы даты без использования to_char в коде sql?

file_handle=open("test.csv","w")
csv_writer = csv.writer(file_handle,dialect="excel",lineterminator='\n',delimiter=';',quoting=csv.QUOTE_NONNUMERIC)
conn=cx_Oracle.connect(connectionstring)
cur = conn.cursor()

cur.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY HH24:MI:SS'")
cur.execute("select attr4,to_char(attr4,'DD.MM.YYYY') from aTable")
rows = cur.fetchmany(16000)

while len(rows) > 0:
    csv_writer.writerows(rows)
    rows = cur.fetchmany(16000)
cur.close()

результат:

"1943-04-21 00:00:00";"21.04.1943"
"1955-12-22 00:00:00";"22.12.1955"
"1947-11-01 00:00:00";"01.11.1947"
"1960-01-07 00:00:00";"07.01.1960"
"1979-12-01 00:00:00";"01.12.1979"

1 Ответ

0 голосов
/ 16 мая 2018

Вывод, который вы видите, происходит из-за того, что результат запроса преобразуется в соответствующие типы данных Python - таким образом, значения первого столбца являются datetime объектами, а второго - строками ( из-за to_char() приведение вы делаете в запросе ).NLS_DATE_FORMAT контролирует вывод только для обычных (пользовательских) клиентов.
Таким образом, вывод в csv является просто представлением по умолчанию для datetime питона;если вы хотите вывести в другой форме, вам просто нужно изменить его.

Поскольку ответ на запрос представляет собой список кортежей, вы не можете просто изменить его на месте - его нужно скопировать имодифицирована;в качестве альтернативы, вы можете написать его строка за строкой, модифицированный.

Вот только часть записи со вторым подходом:

import datetime

# the rest of your code

while len(rows) > 0:
    for row in rows:
        value = (row[0].strftime('%d.%m.%Y'), row[1])
        csv_writer.writerow(value)
    rows = cur.fetchmany(16000)

Для справки, вот краткий список с питоном директивы strftime .

...