我将尝试再次寻求帮助,因此我的基本代码已经准备好,从一开始,它将所有负值都转换为0,然后,它确实计算了csv的总和和累积值数据:
import csv
from collections import defaultdict, OrderedDict
def convert(data):
try:
return int(data)
except ValueError:
return 0
with open('MonthData1.csv', 'r') as file1:
read_file = csv.reader(file1, delimiter=';')
delheader = next(read_file)
data = defaultdict(int)
for line in read_file:
valuedata = max(0, sum([convert(i) for i in line[1:5]]))
data[line[0].split()[0]] += valuedata
for key in OrderedDict(sorted(data.items())):
print('{};{}'.format(key, data[key]))
print("")
previous_values = []
for key, value in OrderedDict(sorted(data.items())).items():
print('{};{}'.format(key, value + sum(previous_values)))
previous_values.append(value)
此代码显示:
1.5.2018 245
2.5.2018 105
4.5.2018 87
1.5.2018 245
2.5.2018 350
4.5.2018 437
这就是我希望它打印数据的方式。首先是每天的总和,然后是累计值。我的问题是,如何格式化该数据,以便可以将其以与打印时相同的格式写入新的csv文件?因此,新的csv文件应如下所示:
我曾经尝试自己做过(带有大写字母),并寻找了答案,但我找不到办法。希望这次能得到解决方案,对此深表感谢。
数据文件为csv:https://files.fm/u/2vjppmgv
pastebin https://pastebin.com/Tw4aYdPc中的数据文件
希望可以使用默认库完成
答案 0 :(得分:2)
编写CSV只是写一个用逗号分隔的值(在这种情况下为分号)的问题。CSV是一个纯文本文件(如果愿意,则是.txt)。您可以使用python的open对其进行读写()功能。
如果愿意,您实际上可以摆脱CSV模块。最后,我提供了一个示例。
此版本仅使用原始代码中可用的库。
import csv
from collections import defaultdict, OrderedDict
def convert(data):
try:
return int(data)
except ValueError:
return 0
file1 = open('Monthdata1.csv', 'r')
file2 = open('result.csv', 'w')
read_file = csv.reader(file1, delimiter=';')
delheader = next(read_file)
data = defaultdict(int)
for line in read_file:
valuedata = max(0, sum([convert(i) for i in line[1:5]]))
data[line[0].split()[0]] += valuedata
for key in OrderedDict(sorted(data.items())):
file2.write('{};{}\n'.format(key, data[key]))
file2.write('\n')
previous_values = []
for key, value in OrderedDict(sorted(data.items())).items():
file2.write('{};{}\n'.format(key, value + sum(previous_values)))
previous_values.append(value)
file1.close()
file2.close()
但是,这里有一个陷阱。由于我没有导入os模块(这是默认库),因此我使用字符\ n结束了这一行。在Linux和Mac上这可以正常工作,但是在Windows下您应该使用\ r \ n。为避免此问题,您应该导入 os模块,并使用os.linesep代替\ n。
import os
(...)
file2.write('{};{}{}'.format(key, data[key], os.linesep))
(...)
file2.write('{};{}{}'.format(key, value + sum(previous_values), os.linesep))
作为旁注,这是一个示例,说明如何不需要CSV模块即可读取CSV :
data = [i.split(";") for i in open('MonthData1.csv').read().split('\n')]
如果您有一个更复杂的CSV文件,尤其是其中包含可能包含分号的字符串,则最好使用CSV模块。
在其他答案中提到的熊猫库是一个很棒的工具。它无疑将能够处理您可能需要处理CSV数据的任何需求。
答案 1 :(得分:1)
此代码创建一个新的csv文件,其格式与所打印的格式相同。
import pandas as pd #added
import csv
from collections import defaultdict, OrderedDict
def convert(data):
try:
return int(data)
except ValueError:
return 0
keys = [] #added
data_keys = [] #added
with open('MonthData1.csv', 'r') as file1:
read_file = csv.reader(file1, delimiter=';')
delheader = next(read_file)
data = defaultdict(int)
for line in read_file:
valuedata = max(0, sum([convert(i) for i in line[1:5]]))
data[line[0].split()[0]] += valuedata
for key in OrderedDict(sorted(data.items())):
print('{} {}'.format(key, data[key]))
keys.append(key) #added
data_keys.append(data[key]) #added
print("")
keys.append("") #added
data_keys.append("") #added
previous_values = []
for key, value in OrderedDict(sorted(data.items())).items():
print('{} {}'.format(key, value + sum(previous_values)))
keys.append(key) #added
data_keys.append(value + sum(previous_values)) #added
previous_values.append(value)
df = pd.DataFrame(data_keys,keys) #added
df.to_csv('new_csv_file.csv', header=False) #added
答案 2 :(得分:0)
这是根本不使用任何导入的版本
def convert(data):
try:
out = int(data)
except ValueError:
out = 0
return out ### try to avoid multiple return statements
with open('Monthdata1.csv', 'rb') as file1:
lines = file1.readlines()
data = [ [ d.strip() for d in l.split(';')] for l in lines[ 1 : : ] ]
myDict = dict()
for d in data:
key = d[0].split()[0]
value = max(0, sum([convert(i) for i in d[1:5]]))
try:
myDict[key] += value
except KeyError:
myDict[key] = value
s1=""
s2=""
accu = 0
for key in sorted( myDict.keys() ):
accu += myDict[key]
s1 += '{} {}\n'.format( key, myDict[key] )
s2 += '{} {}\n'.format( key, accu )
with open( 'out.txt', 'wb') as fPntr:
fPntr.write( s1 + "\n" + s2 )
尽管如此,它使用无序词典,因此sorted()
可能会导致问题。因此,您实际上可能想使用datetime
给予,例如:
import datetime
with open('Monthdata1.csv', 'rb') as file1:
lines = file1.readlines()
data = [ [ d.strip() for d in l.split(';')] for l in lines[ 1 : : ] ]
myDict = dict()
for d in data:
key = datetime.datetime.strptime( d[0].split()[0], '%d.%m.%Y' )
value = max(0, sum([convert(i) for i in d[1:5]]))
try:
myDict[key] += value
except KeyError:
myDict[key] = value
s1=""
s2=""
accu = 0
for key in sorted( myDict.keys() ):
accu += myDict[key]
s1 += '{} {}\n'.format( key.strftime('%d.%m.%y'), myDict[key] )
s2 += '{} {}\n'.format( key.strftime('%d.%m.%y'), accu )
with open( 'out.txt', 'wb') as fPntr:
fPntr.write( s1 + "\n" + s2 )
请注意,我通过在输出中使用%y
而不是%Y
来更改两位数年份。这种格式还会在日期和月份中添加0
。