如何在Python中打开并处理特定类型的所有文件?
我想弄明白怎么用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