Python csv_编写器:更改oracle日期列的输出格式

Python csv_编写器:更改oracle日期列的输出格式,python,csv,date,format,cx-oracle,Python,Csv,Date,Format,Cx Oracle,我有一个带有日期列的表,希望在csv文件中将该列格式化为DD.MM.yyyy,但alter session不会影响python csv_编写器 有没有一种方法可以处理所有日期列而不使用sql代码中的to_char file_handle=open("test.csv","w") csv_writer = csv.writer(file_handle,dialect="excel",lineterminator='\n',delimiter=';',quoting=csv.QUOTE_NONNUM

我有一个带有日期列的表,希望在csv文件中将该列格式化为DD.MM.yyyy,但alter session不会影响python csv_编写器

有没有一种方法可以处理所有日期列而不使用sql代码中的to_char

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"

您看到的输出来自这样一个事实:查询结果被转换为相应的python数据类型——因此第一列的值是
datetime
对象,第二列的值是字符串(由于您在查询中执行的
to_char()
强制转换)。NLS\U DATE\U格式仅控制常规(用户)客户端的输出。
因此,csv中的输出只是python的
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)

作为参考,这里有一个python的简短列表。

您应该在光标上迭代,而不是使用cur.fetchmany()。这样就不需要建立一个16000个条目的列表!可能会有不同的优化,但这不是OP的问题所在-这是针对特定主题的。没错。:-)