如何在Python中打开某种类型的所有文件并进行处理?

时间:2010-01-02 20:03:27

标签: python

我正在试图弄清楚如何让python遍历一个充满csv文件的目录,处理每个文件并吐出带有修剪值列表的文本文件。

在这个例子中,我正在迭代一个包含许多不同类型列的CSV,但我真正想要的只是名字,姓氏和关键字。我有一个充满了这些具有不同列的csv的文件夹(除了它们在csv中共享名字,姓氏和关键字)。打开该文件夹的最佳方法是什么,浏览每个csv文件,然后将其全部吐出为自己的csv文件,仅用于文本列表,如下例所示。

import csv
reader = csv.reader(open("keywords.csv"))
rownum = 0
headnum = 0
F = open('compiled.txt','w')
for row in reader:
    if rownum == 0:
        header = row;
        for col in row:
            if header[headnum]=='Keyword':
                keywordnum=headnum;
            elif header[headnum]=='First Name':
                firstnamenum=headnum;
            elif header[headnum]=='Last Name':
                lastnamenum=headnum;
            headnum +=1
    else:
        currentrow=row
        print(currentrow[keywordnum] + '\n' + currentrow[firstnamenum] + '\n' + currentrow[lastnamenum]) 
        F.write(currentrow[keywordnum] + '\n')

    rownum +=1

5 个答案:

答案 0 :(得分:8)

最好的方法可能是使用shell的globbing能力,或者Python的glob模块。

Shell(Linux,Unix)

外壳:

python myapp.py folder/*.csv

myapp.py:

import sys
for filename in sys.argv[1:]:
    with open(filename) as f:
        # do something with f

Windows(或者没有可用的shell。)

import glob
for filename in glob.glob("folder/*.csv"):
    with open(filename) as f:
        # do something with f

注意:Python 2.5需要from __future__ import with_statement

答案 1 :(得分:4)

问题的“获取所有CSV文件”部分已经多次回答(包括OP),但“获取正确的名为列”还没有:{{ 3}}使它变得微不足道 - “进程一个CSV文件”循环变为:

reader = csv.DictReader(open(thecsvfilename))
for row in reader:
    print('\n'.join(row['Keyword'], row['First Name'], row['Last Name'])) 
    F.write(row['Keyword'] + '\n')

答案 2 :(得分:1)

一些建议:

  • 您可以在地图中保留关键字,名字和姓氏的标题索引,而不是使用单独的变量。这将使以后更容易修改脚本。

  • 您可以使用list index()函数代替循环标题,例如:

    if rownum == 0:
        for header in ('Keyword', 'First Name', 'Last Name'):
            header_index[header] = row.index(header)
    

  • 你可以使用glob模块来获取文件名,但gs可能是正确的,因为shell globbing是一种更好的方法。

  • 使用csv模块编写文件可能更好;我认为它处理转义,所以它可能会更强大。

答案 3 :(得分:1)

我认为在目录中处理大量文件的最佳方法是使用os.walk(在Python os模块docs here中有记录。

这是我写给另一个Python问题的答案,其中包括使用经过测试的Python代码来使用os.walk来打开一堆文件。此版本也访问所有子目录,但很容易将其修改为只停留在一个目录中。

Replace strings in files by Python

答案 4 :(得分:0)

我再次回答了我自己的问题......我导入了os和glob模块以获取路径。