加入约60个时间序列的CSV文件

时间:2019-01-20 23:02:18

标签: python csv glob

我有一些代码可以从2006年左右开始每月下载每月数据,因此文件数量很多。 然后,我运行其他一些代码,将所有月度文件连接到一个包含所有数据的大文件中(请注意第一个文件之后,它每次之后都会删除标题):

from glob import glob
files = sorted(glob('*.csv'))

with open('VIC.csv', 'w') as fi_out:
    for i, fname_in in enumerate(files):            
        with open(fname_in, 'r') as fi_in:               
            for i_line, line in enumerate(fi_in):
                 (i_line > 0)
                if i_line > 0 or i == 0:
                    fi_out.write(line)

这很好用,除了现在我想对不同的州做同样的事情。 即在我下载的文件看起来像这样之前:

before

现在看起来像这样:

now

所以当我运行我的代码时,它就塞满了。

理想情况下,我希望它制作两个csv文件,一个称为VIC,其中所有VIC数据都已加入,而另一个则称为QLD,其中所有QLD数据均已加入。但是我不确定如何修改代码来做到这一点?

谢谢您的任何帮助。

1 个答案:

答案 0 :(得分:1)

因此,最重要的是我修改的代码。首先,我获取了您拥有的代码,并在名为merge的函数中对其进行了重构。您可以使用inputFilesoutputFileName来调用此函数。在第一种情况下,您可以通过以下方式调用它:

merge(sorted(glob('*.csv')), 'VIC.csv')

现在您有2组数据。而不是在所有.csv输入文件上调用它,而是仅在VIC.csv输入文件上调用它:

merge(sorted(glob('*VIC1.csv')), 'VIC.csv')

对于QLD文件,我们也要重复此步骤。完整的代码如下所示。

亲切的问候

from glob import glob

def merge(inputFiles, outputFileName):
    with open(outputFileName, 'w') as fi_out:
        for i, fname_in in enumerate(inputFiles):            
            with open(fname_in, 'r') as fi_in:               
                for i_line, line in enumerate(fi_in):
                    (i_line > 0)
                    if i_line > 0 or i == 0:
                        fi_out.write(line)

merge(sorted(glob('*VIC1.csv')), 'VIC.csv')
merge(sorted(glob('*QLD1.csv')), 'QLD.csv')

一个小的重构,不需要跟踪正在处理的文件或行。

def merge(inputFiles, outputFileName):
    inputFiles = iter(inputFiles)
    with open(outputFileName, 'w') as fi_out:
        #process the first file
        with open(next(inputFiles)) as first_file:
            fi_out = firstfile.read()
        #now just skip the first line in the other files
        for fname in inputFiles:            
            with open(fname_in, 'r') as fi_in:
                skip = next(f_in)
                fi_out.write(fi_in.read())