在Python中为追加输出的CSV文件添加日期列

1 投票
2 回答
2416 浏览
提问于 2025-04-17 20:59

我用下面的代码来合并所有的csv文件:每个文件都有10,000行:

billing_report_2014-02-01.csv
billing_report_2014-02-02.csv
:

fout=open("out.csv","a")
for num in range(1,10):
    print num
    for line in open("billing_report_2014-02-0"+str(num)+".csv"):
         fout.write(line) 
for num in range(10,29):
    print num
    for line in open("billing_report_2014-02-"+str(num)+".csv"):
         fout.write(line) 
fout.close()

但现在我想在输出的out.csv文件中添加一个新的日期列。我该如何添加这个日期列呢?我希望将“2014-02-01”这个值加到每一行中,当我把billing_report_2014-02-01添加到out.csv时;而当我把billing_report_2014-02-02添加到out.csv时,每一行的值则是“2014-02-02”。我该怎么做呢?

2 个回答

2

我觉得你可以在最后加上日期:

for line in open("billing_report_2014-02-0"+str(num)+".csv"):
     fout.write(line+',DATE INFORMATION') 

我假设你的CSV文件确实是用逗号分隔的,如果是用制表符分隔的,那字符应该是\t

你也可以通过一个中间步骤来改变这一行:

line = line + ', DATE INFORMATION'

因为你想要添加文件名的日期,只需按变量添加即可:

line = line + ', 2014-02-0'+ str(num//10)

如果它总是包含“,LLC”这个字符串,你可以使用替换功能,下面有个例子:

>>> string = "100, 90101, California, Example company,LLC, other data"
>>> string.replace(',LLC',';LLC')
'100, 90101, California, Example company;LLC, other data'
>>> 

把这些都放在一起,并试着借鉴一下@Jon Clements的灵感(赞!):

def combine_and_add_date(year, month, startday, endday, replace_dict):
    fout=open("out.csv","a")
    for num in range(startday,endday+1):
        daynum = str(num)
        if len(daynum) ==1:
            daynum = '0'+daynum

        date_info = str(year+'-'month+'-'+daynum)
        source_name = 'billing_report_'+date_info+'.csv'

        for line in open(source_name):
            for key in replace_dict:
                line.replace(key,replact_dict[key])

            fout.write(line+','+date_info) 

    fout.close()

希望这个能奏效,你应该(希望我还是个新手……)这样使用,注意字典的设计是为了让你可以进行各种替换

combine_and_add_date("2014","02",1,28, {',LLC': ';LLC', ',PLC':';PLC'}) 

希望一切顺利

3

首先,列出你想要处理的文件名,然后从这些文件中提取数据。接着,创建一个生成器,这个生成器会处理输入文件,去掉文件末尾多余的空行,并且添加一个新字段,里面包含日期。比如:

filenames = [
  'billing_report_2014-02-01.csv',
  'billing_report_2014-02-02.csv'
]

with open('out.csv', 'w') as fout:
    for filename in filenames:
        to_append = filename.rpartition('_')[2].partition('.')[0]
        with open(filename) as fin:
            fout.writelines('{},{}\n'.format(line.rstrip(),to_append) for line in fin)

撰写回答