我有一些代码可以从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)
这很好用,除了现在我想对不同的州做同样的事情。 即在我下载的文件看起来像这样之前:
现在看起来像这样:
所以当我运行我的代码时,它就塞满了。
理想情况下,我希望它制作两个csv文件,一个称为VIC,其中所有VIC数据都已加入,而另一个则称为QLD,其中所有QLD数据均已加入。但是我不确定如何修改代码来做到这一点?
谢谢您的任何帮助。
答案 0 :(得分:1)
因此,最重要的是我修改的代码。首先,我获取了您拥有的代码,并在名为merge
的函数中对其进行了重构。您可以使用inputFiles
和outputFileName
来调用此函数。在第一种情况下,您可以通过以下方式调用它:
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())