5

我有一个文件夹,其中包含数百个(可能超过 1 k)的 csv 数据文件,按时间顺序排列的数据。理想情况下,这些数据将保存在一个 csv 中,这样我就可以一次完成所有的分析。我想知道的是,有没有一种方法可以使用 python 将所有文件相互附加。

我的文件存在于文件夹位置,如下所示:

C:\Users\folder\Database Files\1st September
C:\Users\folder\Database Files\1st October
C:\Users\folder\Database Files\1st November
C:\Users\folder\Database Files\1st December
etc

在每个文件夹中都有 3 个 csv(我使用 csv 一词很松散,因为这些文件实际上保存为 .txt 文件,其中包含由管道分隔的值|

假设这些文件被称为:

MonthNamOne.txt
MonthNamTwo.txt
MonthNameOneTwoMurged.txt

我将如何,甚至可以编写一些代码来遍历该目录中的所有这些文件夹,然后将所有OneTwoMurged.txt文件合并在一起?

4

3 回答 3

14

对于文件夹中带有.csv后缀的所有文件

import glob
import os

filelist = []

os.chdir("folderwithcsvs/")
for counter, files in enumerate(glob.glob("*.csv")):
    filelist.append(files)
    print "do stuff with file:", files, counter

print filelist

for fileitem in filelist:
    print fileitem

显然,“做的东西”取决于你想对文件做什么,这正在寻找你的文件列表。

如果您想每月对文件进行处理,那么您可以使用 datetime 并创建可能的月份,对于天数或年度数据也是如此。

例如,对于具有名称的每月文件,Month Year.csv它将查找每个文件。

import subprocess, datetime, os

start_year, start_month = "2001", "January"

current_month = datetime.date.today().replace(day=1)
possible_month = datetime.datetime.strptime('%s %s' % (start_month, start_year), '%B %Y').date()
while possible_month <= current_month:
    csv_filename = possible_month.strftime('%B %Y') + '.csv'
    month = possible_month.strftime('%B %Y').split(" ")[0]
    year = possible_month.strftime('%B %Y').split(" ")[1]
    if os.path.exists("folder/" + csv_filename):
        print csv_filename
    possible_month = (possible_month + datetime.timedelta(days=31)).replace(day=1)

显然,您可以将其更改为您认为合适的任何方式,如果您需要更多或是否足够,请告诉我。

于 2013-11-09T15:35:53.193 回答
5

这将递归处理一个目录,匹配一个特定的文件模式进行处理,并附加处理文件的结果。这也将解析 csv,因此您也可以进行单独的行分析和处理。根据需要修改:)

#!python2
import os
import fnmatch
import csv
from datetime import datetime as dt

# Open result file
with open('output.txt','wb') as fout:
    wout = csv.writer(fout,delimiter='|')

    # Recursively process a directory
    for path,dirs,files in os.walk('files'):

        # Sort directories for processing.
        # In this case, sorting directories named "Month Year" chronologically.
        dirs.sort(key=lambda d: dt.strptime(d,'%B %Y'))
        interesting_files = fnmatch.filter(files,'*.txt')

        # Example for sorting filenames with a custom chronological sort "Month Year.txt"
        for filename in sorted(interesting_files,key=lambda f: dt.strptime(f,'%B %Y.txt')):

            # Generate the full path to the file.
            fullname = os.path.join(path,filename)
            print 'Processing',fullname

            # Open and process file
            with open(fullname,'rb') as fin:
                for line in csv.reader(fin,delimiter='|'):
                    wout.writerow(line)
于 2013-11-09T15:53:27.477 回答
3

读入 pandas 数据框(轴的选择取决于您的应用程序),我的示例添加了相同长度的列

import glob
import pandas as pd


df=pd.DataFrame()
for files in glob.glob("*.csv"):
    print files 
    df = pd.concat([df,pd.read_csv(files).iloc[:,1:]],axis=1)

axis = 0将逐行添加

于 2015-10-01T20:47:50.040 回答