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).
各位,
希望你能帮我解决这个问题。 我目前有一个程序可以从图像中读取坐标和日期并将它们写入名为 "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).