Python3 - CSV 编写器

Python3 - CSV Writer

各位,

希望你能帮我解决这个问题。 我目前有一个程序可以从图像中读取坐标和日期并将它们写入名为 "test.csv".

的文件中

在这里你可以找到我当前的代码:

IMAGE_DIRECTORY = Path("/path")

images = list(IMAGE_DIRECTORY.glob("*.jpg")) + list(IMAGE_DIRECTORY.glob("*.png"))

i= 1
date_to_latlng = {}
for image in images:
    meta_data = ImageMetaData(image)
    latlng = meta_data.get_lat_lng()
    date = meta_data.get_date_time()
    date_to_latlng[date] = [latlng, "string", "some other string", i]
    i = i + 1


with open("test.csv", "w", newline="") as csvfile:
    writer = csv.writer(csvfile, delimiter=" ")
    for date in sorted(date_to_latlng):
        writer.writerow(date_to_latlng[date])


目前条目按日期排序并写入文件test.csv。

输出如下所示:

"(52.59504, -126.17413)",some string,some other string, 2
"(43.05749, -121.72245)",some string,some other string, 1

但我希望输出看起来像这样:

52.59504 -126.17413 some string some other string 1
43.05749 -121.72245 some string some other string 2

test.csv 文件中的每个条目末尾都应该有一个升序编号。 此外,“”引号和括号()应删除。

有人知道如何解决这个问题吗?

您可以格式化 latlng 以获得您想要的格式(两个浮点数)。 你可以像这样写一个辅助函数:

def formatLatLang(latlang):
    latlang = latlang.replace('(', '').replace(')', '').split(',')
    return [float(latlang[0]), float(latlang[1])]

这将是 return 两个浮点数的列表。 您需要格式化添加到 date_to_latlng 的内容,以便删除逗号,因为您正在传递列表。您可以将所有这些作为字符串传递。如果你想这样做,不要像上面的方法那样将字符串解析为浮点数,将它们保留为字符串。

[lat, lang] = formatLatLang(latlng)
date_to_latlng[date] = " ".join([lat, lang, "string", "some other string", i])

但是,CSV 表示逗号分隔值,这不会生成有效的 CSV 文件。您可以改为向 .txt 文件中添加一行。

看起来latlng是一个tuple;将其解包为两个变量将消除括号问题。由于我们尚未对数据进行排序,因此我们不会尝试添加最后一列。

date_to_latlng = {}
for image in images:
    meta_data = ImageMetaData(image)
    lat, lng = meta_data.get_lat_lng()
    date = meta_data.get_date_time()
    date_to_latlng[date] = [lat, lng, "string", "some other string"]

现在我们可以使用 enumerate 内置函数在迭代排序数据时设置最后一列。

with open("test.csv", "w", newline="") as csvfile:
    writer = csv.writer(csvfile, delimiter=" ")
    for i, date in enumerate(sorted(date_to_latlng), start=1):
        row = date_to_latlng[date]
        row.append(i)
        writer.writerow(row)

请注意,如果您使用 space 作为列分隔符编写 csv,嵌入 space 的值将在双引号内引用(或 [=13= 的值) ] 你传递给 csv.writer).