获取文件夹的文件路径并保存在Python中的CSV文件

问题描述:

我使用python 2-7获取文件路径并保存在CSV(逗号分隔值)文件中。它包含路径和文件夹中的所有文件。对于不同文件夹中的文件,它以逗号分隔,然后是其文件夹中没有字符的数字。例如,我有图像1.pgm,它存储在文件夹s14中。然后CSV格式看起来像获取文件夹的文件路径并保存在Python中的CSV文件

at/s14/1.pgm;14 

其中,at/s14/1.pgm是将文件的完整路径1.pgm14是从它的文件夹s14获得数(称为标签)。你能帮我通过python实现吗?我试图与代码,但它不适合我的任务工作

#!/usr/bin/env python 

import sys 
import os.path 
# |-- s14 
# | |-- 1.pgm 
# | |-- ... 
# | |-- 10.pgm 
# |-- s20 
# | |-- 1.pgm 
# | |-- ... 
# | |-- 10.pgm 
# ... 
# |-- s40 
# | |-- 1.pgm 
# | |-- ... 
# | |-- 10.pgm 
# 

if __name__ == "__main__": 

    if len(sys.argv) != 2: 
     print "usage: create_csv <base_path>" 
     sys.exit(1) 

    BASE_PATH=sys.argv[1] 
    SEPARATOR=";" 

    label = 0 
    for dirname, dirnames, filenames in os.walk(BASE_PATH): 
     for subdirname in dirnames: 
      subject_path = os.path.join(dirname, subdirname) 
      for filename in os.listdir(subject_path): 
       abs_path = "%s/%s" % (subject_path, filename) 
       print "%s%s%d" % (abs_path, SEPARATOR, label) 
      label = label + 1 

预期输出是

at/s14/1.pgm;14 
at/s14/2.pgm;14 
.... 
at/s14/10.pgm;14 
at/s20/1.pgm;20 
at/s20/2.pgm;20 
.... 
at/s20/10.pgm;20 
.... 
at/s40/1.pgm;40 
at/s40/2.pgm;40 
.... 
at/s40/10.pgm;40 

在这at是包含子文件夹s14,s20...在窗根文件夹路径,它看起来像"E:\at"

您非常接近解决方案。你应该在这里查找Python的正则表达式类:

https://docs.python.org/2/library/re.html

  • 或 -

https://docs.python.org/3.4/library/re.html

我真的只加一行到你的应用程序(和去除夫妇):

#!/usr/bin/env python 

import os.path 
import re 
import sys 

if __name__ == "__main__": 

    if len(sys.argv) != 2: 
     print "usage: create_csv <base_path>" 
     sys.exit(1) 

    BASE_PATH=sys.argv[1] 
    SEPARATOR=";" 

    for dirname, dirnames, filenames in os.walk(BASE_PATH): 
     for subdirname in dirnames: 
      subject_path = os.path.join(dirname, subdirname) 
      for filename in os.listdir(subject_path): 
       abs_path = "%s/%s" % (subject_path, filename) 
       label = re.search('s([0-9]+)', subject_path) 
       print "%s%s%s" % (abs_path, SEPARATOR, label.group(1)) 

此代码将输出:

$ ./create_csv.py . > output.csv 
./s14/1.pgm;14 
./s14/2.pgm;14 
./s14/3.pgm;14 
./s20/1.pgm;20 
./s20/2.pgm;20 
./s20/3.pgm;20 
./s40/1.pgm;40 
./s40/2.pgm;40 
./s40/3.pgm;40 

快速提示:这实际上不是CSV。您需要替换';'与','。

另外,作为一个练习,由于您在循环中运行它,并且您不知道有多少个目录和文件,因此应该首先编译正则表达式以提高速度。提示:re.compile()。

另外,正则表达式有点松散。你可以在每边用'/'锚点来加紧,以确保你只捕获你想要的东西。有关定义该正则表达式的帮助,请查看https://www.regex101.com/

+1

感谢您的帮助。 – Jame 2015-04-04 13:35:04