在目录中的所有文件上运行python脚本

时间:2010-04-09 16:32:14

标签: python command-line scripting

我有一个Python脚本,可以读取文本csv文件并创建播放列表文件。但是我一次只能做一个,比如:

python playlist.py foo.csv foolist.txt

但是,我有一个文件目录需要制作成播放列表,名称不同,有时还有不同数量的文件。

到目前为止,我已经看过创建一个txt文件,其中列出了目录中文件的所有名称,然后遍历每一行,但我知道必须有一种更简单的方法。

4 个答案:

答案 0 :(得分:8)

for f in *.csv; do
  python playlist.py "$f" "${f%.csv}list.txt"
done

这会诀窍吗?这将把foo.csv放在foolist.txt和abc.csv中的abclist.txt中。

或者您是否希望它们都在同一个文件中?

答案 1 :(得分:4)

只需使用asterisk glob的for循环,确保为文件名中的空格引用适当的东西

for file in *.csv; do
   python playlist.py "$file" >> outputfile.txt;
done

答案 2 :(得分:3)

是单个目录还是嵌套?

实施例

topfile.csv
topdir
   --dir1
       --file1.csv
       --file2.txt
       --dir2
           --file3.csv
           --file4.csv

对于嵌套,您可以使用os.walk(topdir)以递归方式获取目录中的所有文件和目录。

您可以将脚本设置为接受目录或文件:

python playlist.py topfile.csv topdir

import sys
import os

def main():
    files_toprocess = set()
    paths = sys.argv[1:]
    for p in paths:
        if os.path.isfile(p) and p.endswith('.csv'):
            files_toprocess.add(p)
        elif os.path.isdir(p):
            for root, dirs, files in os.walk(p):
                files_toprocess.update([os.path.join(root, f) 
                                        for f in files if f.endswith('.csv')])

答案 3 :(得分:2)

如果您有目录名,可以使用os.listdir

os.listdir(dirname)

如果您只想选择某种类型的文件,例如只能使用csv文件,则可以使用glob模块。