我有一个包含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
答案 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
,在这种情况下为空字符串。