Python将数据格式化为CSV文件

时间:2018-11-22 13:55:23

标签: python python-3.x csv

我将尝试再次寻求帮助,因此我的基本代码已经准备好,从一开始,它将所有负值都转换为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文件应如下所示:
enter image description here

我曾经尝试自己做过(带有大写字母),并寻找了答案,但我找不到办法。希望这次能得到解决方案,对此深表感谢。
数据文件为csv:https://files.fm/u/2vjppmgv
pastebin https://pastebin.com/Tw4aYdPc中的数据文件 希望可以使用默认库完成

3 个答案:

答案 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