Python将数据格式化为csv文件

Python将数据格式化为csv文件,python,python-3.x,csv,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'

我将再次尝试寻找帮助,这样我的基本代码就准备好了,在一开始,它将所有负值转换为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文件应该如下所示:

我试着自己去做(用dateime),并寻找答案,但我就是找不到办法。我希望这次能找到解决方案,我将不胜感激。
将数据文件设置为csv:
pastebin中的数据文件
希望可以使用默认库完成此操作

此代码创建一个与打印内容格式相同的新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

这段代码创建了一个与打印内容格式相同的新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

编写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()
这里有一个问题。由于我没有导入操作系统模块(这是默认库),我使用了字符\n来结束这行。这在Linux和Mac下可以正常工作,但在windows下您应该使用\r\n。为避免此问题,您应该导入操作系统模块,并使用os.linesep而不是\r\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模块


其他答案中提到的pandas库是一个很好的工具。它肯定能够满足您处理CSV数据的任何需要。

编写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()
这里有一个问题。由于我没有导入操作系统模块(这是默认库),我使用了字符\n来结束这行。这在Linux和Mac下可以正常工作,但在windows下您应该使用\r\n。为避免此问题,您应该导入操作系统模块
,并使用os.linesep而不是\r\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模块


其他答案中提到的pandas库是一个很好的工具。它肯定能够满足您处理CSV数据的任何需要。

这是一个完全不使用任何导入的版本

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
giving,例如:

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
更改为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
giving,例如:

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
更改为2位数的年份。这种格式还将
0
添加到日和月。

我可能没有完全理解您的问题,但您似乎只需要更改“{};”的两个“{}{}”匹配项“。在我的测试中,生成的CSV文件看起来与第二个图像完全相同。如果这是问题所在,那么这不是格式化日期的问题,而是格式化列的问题。是的,谢谢。你知道我应该如何将数据写入CSV文件吗?我不知道这一部分如果数据位于名为df的数据框中,那么只需将熊猫作为p导入即可。”d df.to_csv(“\\path\\output.csv”)我已经有了默认库的全部代码,您知道在没有外部库的情况下应该如何做吗?Pandas不是外部库。我可能还没有完全理解您的问题,但您似乎只需要将两个出现的“{}{}”改为“{};{}”“。在我的测试中,生成的CSV文件看起来与第二个图像完全相同。如果这是问题所在,那么这不是格式化日期的问题,而是格式化列的问题。是的,谢谢。你知道我应该如何将数据写入CSV文件吗?我不知道这一部分如果数据位于名为df的数据框中,那么只需将熊猫作为p导入即可。”d df.to_csv(\\path\\output.csv)我有默认库的全部代码,你有没有想法在没有外部库的情况下如何做到这一点?Pandas不是外部库。谢谢你的回答,我有一个使用Pandas的版本,我正在寻找一个使用默认库的解决方案。你认为有可能吗?我不熟悉你所说的默认库是什么意思.是否包含numpy?默认情况下,我指的是不需要单独安装的东西。我不认为包含numpy。如果您在问题中指定了这一点,那就太好了。不幸的是,我帮不上忙。Sorr