【问题标题】:How do I open all files of a certain type in Python and process them?如何在 Python 中打开某种类型的所有文件并进行处理?
【发布时间】:2010-12-31 20:22:39
【问题描述】:

我试图弄清楚如何让 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

【问题讨论】:

    标签: python


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      外壳(Linux、Unix)

      壳牌:

      python myapp.py 文件夹/*.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

      【讨论】:

      • 关于使用 glob 的注意事项——OS X 返回按字母顺序排序的集合,Linux 不按特定顺序返回它。可能无关紧要,但很高兴知道。
      【解决方案3】:

      一些建议:

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

      • 你可以使用 list index() 函数而不是遍历标题,例如:

        如果 rownum == 0: 对于('关键字','名字','姓氏')中的标题: header_index[header] = row.index(header)
      • 您可以使用 glob 模块来获取文件名,但 gs 可能是正确的,shell globbing 是一种更好的方法。

      • 最好也使用 csv 模块来写入文件;我认为它可以处理转义,因此它可能会更健壮。

      【讨论】:

        【解决方案4】:

        问题的“获取所有 CSV 文件”部分已多次回答(包括 OP),但“获取正确的 named 列”尚未回答:@987654321 @ 让它变得微不足道——“处理一个 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')
        

        【讨论】:

          【解决方案5】:

          我认为处理目录中的一堆文件的最佳方法是使用 os.walk(记录在 Python os 模块文档here

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

          Replace strings in files by Python

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-14
            相关资源
            最近更新 更多