大家
希望您能帮助我解决这个问题。 我目前有一个程序,可以从图像中读取坐标和日期并将其写入名为“ 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文件中的每个条目都应在末尾使用升序编号。 此外,应删除“”引号和方括号()。
有人知道如何解决吗?
答案 0 :(得分:1)
看来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)
请注意,如果您要编写一个以空格作为列定界符的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文件中添加一行。