我使用python 2-7获取文件路径并保存在CSV
(逗号分隔值)文件中。它包含路径和文件夹中的所有文件。将文件放在不同的文件夹中,用逗号分隔,然后用不带字符的文件夹编号。例如,我有一个存储在文件夹1.pgm
中的图像s14
。然后CSV格式看起来像
at/s14/1.pgm;14
其中,at/s14/1.pgm
是文件1.pgm
的完整路径,14
是从其文件夹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"
答案 0 :(得分:1)
您非常接近解决方案。你应该在这里查找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/