2016-11-10 51 views
0

我有以下形式的.csv:从CSV表样文件

SYSID,DATA,PERIOD_NAME,ORA,MIPS 
PROD,2016-11-02,PRIME,10,3459.48 
PROD,2016-11-02,PRIME,11,2837.16 
PROD,2016-11-02,PRIME,12,2624.15 

,我想获得输出像这样

SYSID DATA   PERIOD_NAME ORA MIPS 
PROD  2016-11-02 PRIME  10  3459.48 
PROD  2016-11-02 PRIME  11  2837.16 
PROD  2016-11-02 PRIME  12  2624.15 

我已经试过

import csv 
inf = open('pathtofile\\out.csv') 
reader=csv.reader(inf) 
ofile = open('pathtofile\\fuffa.txt', "wb") 
writer = csv.writer(ofile, delimiter='\t') 
for row in reader: 
    writer.writerow(row) 

但给我以下“未格式化表”

SYSID DATA PERIOD_NAME ORA MIPS 
PROD 2016-11-02 PRIME 10 3459.48 
PROD 2016-11-02 PRIME 11 2837.16 
PROD 2016-11-02 PRIME 12 2624.15 

我环顾四周,但找不到对我的问题有用的东西。 任何提示都非常感谢。

+0

这是否http://stackoverflow.com/a/33243260/2451259回答你的问题:


为了做到这在Python 2.6的工作,该脚本可以作如下修改? – maahl

+0

谢谢@maahl,或许它有效,但我认为Martin的答案更易于理解。 –

回答

4

你可以滚你自己的列格式如下:

import csv 

def write_cols(data): 
    col_spacer = " "  # added between columns 
    widths = [0] * len(data[0]) 

    for row in data: 
     widths[:] = [max(widths[index], len(str(col))) for index, col in enumerate(row)] 

    return [col_spacer.join("{:<{width}}".format(col, width=widths[index]) for index, col in enumerate(row)) for row in data] 


with open('input.csv', 'rb') as f_input, open('output.txt', 'w') as f_output: 
    rows = list(csv.reader(f_input)) 

    for row in write_cols(rows): 
     f_output.write(row + '\n') 

给你以下输出文件:

SYSID DATA   PERIOD_NAME ORA MIPS  
PROD 2016-11-02 PRIME   10 3459.48 
PROD 2016-11-02 PRIME   11 2837.16 
PROD 2016-11-02 PRIME   12 2624.15 

此计算最大宽度为每列所有值,然后空格条目因此。请注意,确保CSV文件中的所有条目都包含相同的列数,例如没有空行。

import csv 

def write_cols(data): 
    col_spacer = " "  # added between columns 
    widths = [0] * len(data[0]) 

    for row in data: 
     widths[:] = [max(widths[index], len(str(col))) for index, col in enumerate(row)] 

    return [col_spacer.join("{0:<{width}}".format(col, width=widths[index]) for index, col in enumerate(row)) for row in data] 


with open('input.csv', 'rb') as f_input: 
    with open('output.txt', 'w') as f_output: 
     rows = list(csv.reader(f_input)) 

     for row in write_cols(rows): 
      f_output.write(row + '\n') 
+0

嗨马丁,这段代码完全适用于Python 2.7,但不适用于2.6。 我想调整代码以便运行在2.6以及以下提示http://stackoverflow.com/questions/40589550/indexerror-list-index-out-of-range-reading-writing-from-to文件和这里http://stackoverflow.com/questions/40587244/why-does-a-python-script-work-on-windows-and-not-in-linux但没有成功。你能帮我解决这个问题吗? –

+0

它需要一些调整才能在2.6中工作。我已经添加了一个我已经在Python 2.6.6中测试过的版本。 –

+0

uhm仍然没有工作: 对于索引,文件“format.py”,第19行,在write_cols中 return [col_spacer.join(“{0:<{width}}” )for row in data] 文件“format.py”,第19行,在 return [col_spacer.join(“{0:<{width}}”....)for index,col in e numerate(row ))for row in data] IndexError:列表索引超出范围 –