2016-06-08 20 views
0

我有一个从数据库转储数据到一个CSV通过Python的CSV作家文件的脚本(更准确地说,unicodecsv)演员列文本或前缀与撇号当用Python编写一个CSV文件2.7

我问题是我有一列需要作为文本或前缀转换为撇号,因为它是一个16位数字,在Excel中查看时其格式为科学。否则,代码完美无缺。列名称简称为“值”。任何干净的方式来实现这一目标

def dump(self, sql, filename, include_headers=True): 
    f = unicodecsv.writer(file(filename + ".csv", 'wb'), dialect=unicodecsv.excel, quoting=unicodecsv.QUOTE_ALL) 
cnxn = pyodbc.connect(self.connect_string) 
c = cnxn.cursor() 
c.execute(sql) 

if include_headers: 
    f.writerow([d[0] for d in c.description]) 

    for row in c.fetchall(): 
     f.writerow(row) 

    # f.close() 
    cnxn.close() 
+1

你可以构造一个查询,将返回该列从数据库字符串? – wwii

+0

或者遍历行并替换违规值:[https://code.google.com/archive/p/pyodbc/wikis/Rows.wiki](https://code.google.com/archive/p /pyodbc/wikis/Rows.wiki) – wwii

+0

我用你的建议去了,并在SQL代码前加了一个撇号,它的工作原理就是......。撇号显示在Excel中,而不是像往常一样简单地格式化单元格,我可以与之一起生活。我宁愿在Python级别执行此操作,但它可以工作。 感谢您的协助。 –

回答

1

遍历行,并用一个字符串替换值:

第一个例子:定义一个函数,使一个变化,然后使用map实施变更:

import functools 
def change(row, col): 
    '''changes the column of a pyodbc row 

    returns modified pyodbc row 
    ''' 
    return setattr(row, col, str(getattr(row, col))) 

# partial function that specifies the 'foo' column 
change_foo = functools.partial(change, col = 'foo') 

if include_headers: 
    f.writerow([d[0] for d in c.description]) 
    rows = c.fetchall() 
    # modify the column in each row 
    rows = map(change_foo, rows) 
    for row in rows: 
     f.writerow(row) 

第二个例子:在写入之前修改该列

if include_headers: 
    f.writerow([d[0] for d in c.description]) 
    for row in = c.fetchall(): 
     row.foo = str(row.foo) 
     f.writerow(row) 

甚至:

if include_headers: 
    f.writerow([d[0] for d in c.description]) 
    for row in = c.fetchall(): 
     f.writerow(change_foo(row)) 
+0

我玩过这个,得到了理想的结果。非常感谢你! –

+0

我也学到了很多! –