如何使用python在csv文件或excel文件中编写输出

时间:2017-10-11 06:12:56

标签: python excel csv

我有一个包含6列的csv文件..这是我正在执行操作的相同数据。

16  28-Sep-17   9700    291.8   291.8   9964.4
17  28-Sep-17   9700    186.3   186.3   9872.6
18  28-Sep-17   9700    166.6   166.6   9871.5
24  28-Sep-17   9800    227.5   227.5   9952.2
25  28-Sep-17   9800    202.55  202.55  9916.2

所以我想把电视和电视放到另一个文件中...以下面显示的格式..

9700                             ** 9800**
TV/tv                            **TV/tv**
TV/tv                            **TV/tv**

我确实添加了writer = writerow(),但它只是在绘制奇怪的东西......

对于列名,我添加了这个条件C > 21,其中C将在“9700”变为9800时绘制....直到那时它应该在该列标题下添加数据....

我得到这样的输出......

9700 
47.65
33.8
53.75
43.95
,,9800
68.2
49
76
62.3

希望你们明白

import csv

out = open('G:\out1.csv','w') 
with open('G:\outpuop.csv', 'r+') as f:
    reader = csv.reader(f)
    writer = csv.writer(out)
y = list(reader)         
L = len(y)
A = []
M = 0
c = 1

for x in range(1,L):
    if c > 21:
        print float(y[x][2])

        c = 1

    if (float(y[x][2])) > (float(y[x][5])) : 
        if ((float(y[x][4])) != 0 ):
           TV = (float(y[x][4])) - ((float(y[x][2])) - (float(y[x][5])))
           print TV
           M = TV + M
           c = c + 1

           A.append(TV)                  
           writer.writerow(A)

        else:
           TV = (float(y[x][3])) - ((float(y[x][2])) - (float(y[x][5])))
           print TV
           M = TV + M
           c = c + 1
           A.append(TV)                  
           writer.writerow(A)

    else:
        if ((float(y[x][4])) != 0 ):
            tv = (float(y[x][4])) 
            print tv
            M = tv + M
            c = c + 1
            A.append(TV)                  
            writer.writerow(A)

        else:
             tv = (float(y[x][3])) 
             print tv
             M = tv + M
             c = c + 1
             A.append(TV)                  
             writer.writerow(A)

print M 

1 个答案:

答案 0 :(得分:1)

假设您的CSV看起来像:

c1,c2,c3,c4,c5,c6
16,28-Sep-17,9700,291.8,291.8,9964.4
17,28-Sep-17,9700,186.3,186.3,9872.6
18,28-Sep-17,9700,166.6,166.6,9871.5
24,28-Sep-17,9800,227.5,227.5,9952.2
25,28-Sep-17,9800,202.55,202.55,9916.2

此脚本将读取文件并根据第三列创建单个列表。然后它将转置列表,以便可以一次一行地写出数据(在编写CSV文件时需要):

from itertools import izip_longest
from collections import defaultdict
import csv

models = defaultdict(list)

with open('outpuop.csv') as f_input:
    csv_input = csv.reader(f_input)
    header = next(csv_input)

    for row in csv_input:
        # Convert c3 to c6 into floats
        row[2:6] = map(float, row[2:6])

        if row[2] > row[5]:
            if row[4] != 0:
                TV = row[4] - (row[2] - row[5])
                models[row[2]].append(TV)
            else:
                TV = row[3] - (row[2] - row[5])
                models[row[2]].append(TV)
        else:
            tv = row[4]
            models[row[2]].append(tv)


columns = sorted(models.keys())
data = [[int(column)] + ["{:.2f}".format(v) for v in models[column]] for column in columns]

with open('out1.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerows(izip_longest(*data, fillvalue=''))

这将创建一个包含以下内容的输出CSV文件:

9700,9800
291.80,227.50
186.30,202.55
166.60,

models使用列表字典来保存TV信息。然后通过首先获取所有字典键的列表并对它们进行排序,将其转换为data。对于每个键,将从键名开始列表,然后附加该键的所有元素。在执行此操作时,每个浮点数将转换回只有2位小数的字符串。

data现在包含写回文件所需的所有信息,但它按列顺序排列。该文件需要按行顺序写入。此外,每列可以是不同的长度。解决这个问题的诀窍是使用izip_longest()将所有数据传递给一个单独的值(使用*)。这具有转置数据的效果,即将列列表转换为行列表。 writerows()函数可以在一次调用中将所有数据写入输出文件。请注意,如果使用了正常的zip(),则会在列长于另一列时停止。 izip_longest()继续为任何缺失的元素添加fillvalue,在这种情况下为空字符串。