【问题标题】:How to write a csv file with 2 columns consisting of path+filenames from two different folders in Python?如何编写一个包含 2 列的 csv 文件,其中包含来自 Python 中两个不同文件夹的路径+文件名?
【发布时间】:2017-08-23 07:39:41
【问题描述】:

我想创建一个包含 2 列的 csv 文件,其中包含连接的路径 + 文件名。第一列应包含文件夹 1 的路径+文件名,第二列应包含文件夹 2 的路径+文件名。 这两个操作应该是并行的。

Col1 Col2
数据/RGB/image_6_1.png,数据/后/深度/image_6_0.png 该列表包含更多图片。

名称顺序应该相似。可能是一个 zip 函数会有所帮助?

【问题讨论】:

  • 请将代码粘贴到问题本身中。

标签: python python-2.7 python-3.x csv export-to-csv


【解决方案1】:

Python 的izip_longest() 在这种情况下很有用。它将一次为您提供两个列表中的元素。当一个列表用完时(即一个文件夹中的文件多于另一个),默认情况下它将为空元素返回None。有了这个,您可以将每个文件夹中的文件列表传递给它,并使用 Python 的 csv 库将它们写入您的 CSV 文件,如下所示:

from itertools import izip_longest
import os
import csv


def numbers(x):
    s = x.split('_')
    output = []

    for v in s:
        try:
            output.append(int(v))
        except ValueError as e:
            output.append(v)

    return output   

folder1 = r"/my/folder1"
folder2 = r"/my/folder2"

with open('output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output)

    for f1, f2 in izip_longest(sorted(os.listdir(folder1), key=numbers), sorted(os.listdir(folder2), key=numbers)):
        p1 = p2 = ''

        if f1:
            p1 = os.path.join(folder1, f1)
        if f2:
            p2 = os.path.join(folder2, f2)

        csv_output.writerow([p1, p2])

os.path.join() 用于安全地将路径组件连接在一起。

由于您的文件名包含数字,因此要按数字排序,您需要拆分每个名称并尽可能将生成的字符串列表转换为整数。这将让它按数字排序。

这个例子是为 Python 2.x 设计的


或者,如果不是使用您自己的逻辑对其进行排序,您可以使用诸如natsorted 之类的库:

from itertools import izip_longest
from natsort import natsorted
import os
import csv


folder1 = r"/my/folder1"
folder2 = r"/my/folder2"

with open('output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output)

    for f1, f2 in izip_longest(natsorted(os.listdir(folder1)), natsorted(os.listdir(folder2))):
        p1 = p2 = ''

        if f1:
            p1 = os.path.join(folder1, f1)
        if f2:
            p2 = os.path.join(folder2, f2)

        csv_output.writerow([p1, p2])

这可以通过以下方式安装:

pip install natsorted

【讨论】:

  • 感谢马丁,它有效。但是一个小问题。此代码中不维护名称顺序。 data/RGB/image_6_1.png, data/rear/depth/image_6_0.png 获取data/RGB/image_55_1.png, data/rear/depth/image22_0.png的csv,两者应该对应或者需要排序。
  • listdir() 的输出可以在传递给izip_longest() 之前进行排序。但是,在您的情况下,您的姓名将需要额外的努力才能按数字而不是字母顺序排序。
  • 关于如何进行的任何建议。如果我不对其进行排序,则 csv 文件的生成将毫无用处。
  • 我已经更新了脚本,向您展示了两种解决方案。首先,我将您的文件名拆分为_ 字符,将每个部分转换为数字并根据结果列表进行排序。其次,我展示了如何使用名为 natsorted 的库来做同样的事情。
  • 我在这里找到了解决方案。 Sort os.listdir files Python 感谢您编辑脚本。
猜你喜欢
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多