【问题标题】:how to write output in csv file or excel file using python如何使用python在csv文件或excel文件中写入输出
【发布时间】:2017-10-11 06:12:55
【问题描述】:

我有一个包含 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

所以我想把 TV 和 tv 放到另一个文件中……格式如下所示……

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 

【问题讨论】:

  • 嘿!,欢迎堆栈溢出。尝试隔离你的问题并写一些容易掌握的东西。您的问题涉及我们没有的数据,我们看不到预期的输出。我建议阅读:stackoverflow.com/help/how-to-ask
  • 另外,您的编写器将无法工作,因为文件在with 块的末尾关闭。
  • @AntonvBR 嘿用数据解释了......我想要什么......希望我解释得很好......
  • @blakev 我将在with 之后移动那个作家,但没有得到期望的输出。
  • 请根据您提供的数据显示您应该获得的确切输出。您要对数据进行哪些计算?

标签: python excel csv


【解决方案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,在本例中为空字符串。

【讨论】:

  • 先生,我正在对该 csv 文件执行操作并以符号TV nd tv 输出...现在的输出格式是这样的 9700 47.65 33.8 53.75 43.95 9800 68.2 49 76 62.3所以想要这个到另一个 excel 或 csv 文件中,就像你展示的那样......
  • 对于您提供的数据,我无法理解您的结果。我已经尽可能地更新了脚本。
  • 谢谢先生欣赏
  • 它确实做到了先生...非常感谢...对我来说就像魔术一样.. :)
  • 感谢您的解释。真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2019-07-18
  • 2020-04-04
  • 1970-01-01
相关资源
最近更新 更多