Python3-CSV编写器

时间:2019-11-17 12:38:18

标签: python csv python-3.6

大家

希望您能帮助我解决这个问题。 我目前有一个程序,可以从图像中读取坐标和日期并将其写入名为“ 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文件中的每个条目都应在末尾使用升序编号。 此外,应删除“”引号和方括号()。

有人知道如何解决吗?

2 个答案:

答案 0 :(得分:1)

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

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)

请注意,如果您要编写一个以空格作为列定界符的csv,则带有嵌入式空格的值将用双引号引起来(或传递给csv.writer的quotechar的值)。 / p>

答案 1 :(得分:0)

您可以格式化latlng以获得所需的格式(两个浮点数)。 您可以编写这样的辅助函数:

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

这将返回两个浮点数的列表。 您需要格式化添加到date_to_latlng的内容,以便删除逗号,因为您要传入列表。您可以将所有这些作为字符串传递。如果要执行此操作,请不要像上述方法那样将字符串解析为浮点数,而应将其保留为字符串。

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

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