在目录中对所有文件运行Python脚本

8 投票
4 回答
25047 浏览
提问于 2025-04-15 21:25

我有一个Python脚本,它可以读取一个文本格式的csv文件,然后生成一个播放列表文件。不过我现在只能一次处理一个文件,比如:

python playlist.py foo.csv foolist.txt

但是我有一个文件夹,里面有很多文件需要制作成播放列表,每个播放列表的名字都不一样,有时候文件的数量也不同。

到目前为止,我考虑过先创建一个txt文件,把文件夹里所有文件的名字列出来,然后再逐行处理这些名字。不过我知道肯定有更简单的方法可以做到这一点。

4 个回答

4

这是一个单独的文件夹,还是里面还有其他文件夹呢?

举个例子:

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')])
6

只需要用一个for循环配合星号通配符,确保在文件名中有空格时正确加上引号。

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

这样做可以吗?这段代码会把foo.csv放进foolist.txt里,把abc.csv放进abclist.txt里。

还是说你想把它们都放在同一个文件里?

撰写回答