首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取文件夹的文件路径并保存在python中的CSV文件中。

获取文件夹的文件路径并保存在python中的CSV文件中。
EN

Stack Overflow用户
提问于 2015-04-04 12:51:12
回答 1查看 1.9K关注 0票数 0

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

代码语言:javascript
复制
at/s14/1.pgm;14

其中,at/s14/1.pgm是文件1.pgm的完整路径,14是从其文件夹s14获取的数字(称为标签)。你能帮我用python实现它吗?我试过使用该代码,但它不适用于我的任务。

代码语言:javascript
复制
#!/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

预期输出是

代码语言:javascript
复制
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"

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-04 13:20:17

你离解决方案很近。您应该在这里查找Python正则表达式类:

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

  • 或者-

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

我只在你的应用程序中添加了一行(并删除了几行):

代码语言:javascript
复制
#!/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))

此代码将输出:

代码语言:javascript
复制
$ ./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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29446617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档