如何在Python中打开并处理特定类型的所有文件?

4 投票
5 回答
9411 浏览
提问于 2025-04-15 17:33

我想弄明白怎么用Python去处理一个装满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 个回答

1

这里有几个建议:

  • 你可以把关键词、名字和姓氏的索引放在一个映射表里,而不是用单独的变量。这样以后修改脚本会更方便。

  • 你可以用列表的 index() 函数来查找索引,而不是一个一个循环查找,比如说:

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

  • 你可以使用 glob 模块来获取文件名,不过 gs 可能说得对,使用 shell 的通配符方式会更好。

  • 写文件的时候,使用 csv 模块可能会更好;我觉得它能处理一些特殊字符,所以可能会更稳妥。

4

问题中提到的“获取所有CSV文件”这一部分已经被回答了好几次(包括提问者自己),但“获取正确的命名列”这一部分还没有人回答。其实,使用csv.DictReader可以很简单地解决这个问题——处理一个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')
8

最好的方法可能是使用命令行的通配符功能,或者使用Python的glob模块。

命令行(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(或者没有命令行可用)

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

撰写回答