【问题标题】:Python3 - CSV Writer Sort by DatePython3 - CSV Writer 按日期排序
【发布时间】:2019-11-16 23:16:40
【问题描述】:

我在创建 Python 脚本时遇到了一些问题,希望您能帮助我。

脚本应该从多个图像中读取 exif 信息(日期、时间和 GPSInfo),并将按日期排序的结果写入 CSV 文件。

目前我设法将数据写入 CSV 文件。但我无法按日期对条目进行排序。

# for every file in the directory get the latlng
for file in os.listdir("/path/"):
    if file.endswith(".jpg" or ".png"):
        path_name = '/path'+ file
        meta_data =  ImageMetaData(path_name)
        latlng =meta_data.get_lat_lng()
        date = meta_data.date
        print(latlng, date)
        with open('dez.csv', 'w', newline='') as csvfile:
            spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
            for x in range(0, 10):
                spamwriter.writerow(latlng)
                spamwriter.writerow(date)

【问题讨论】:

  • 只是让你知道,你应该完成writer.writerow([date, latlng])。您的代码现在只是编写一个字符串,其中包含两个作为单个 csv 列。
  • 熊猫是你可以使用的东西吗,它非常适合这种情况
  • @oppressionslayer 你的评论对他有什么帮助?
  • 您的代码错误file.endswith(".jpg" or ".png") 将首先执行".jpg" or ".png",其评估结果为True,因此您的代码执行if file.endswith(True),这将引发TypeError。您运行以获得结果的代码与您在此处粘贴的代码不同。

标签: python python-3.x csv writer


【解决方案1】:

既然你说你不想要输出 CSV 中的实际日期,你应该建立一个字典映射 dates 到 lat_lng 对,对字典的键进行排序,然后将字典的每个值写入 CSV。

from pathlib import Path

IMAGE_DIRECTORY = Path("/home/user/Schreibtisch/recoveredPictures/")

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

date_to_lat_lng = {}
for image in images:
    meta_data = ImageMetaData(path_name)
    lat_lng = meta_data.get_lat_lng()
    date = meta_data.get_date_time()
    date_to_lat_lng[date] = [lat_lng[0], lat_lng[1]]

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

(更新了您在 cmets 中要求的所有更改)

【讨论】:

  • 嗨,鲍里斯,感谢您的回复。到目前为止它有效。我想对内容进行排序,但只将坐标和一些字符串写入文件 test.csv 而不是日期。 test.csv 应该有的内容: latlng String1 String2 你有解决方案或关于如何实现它的提示吗?
  • 将data_and_latlng = [] 更改为字典,将日期映射到您要为该日期写入的字符串列表(即data_to_latlng = {}),将append 行更改为date_to_latlng[date] = [latlng, "some string", "some other string"] 然后而不是@ 987654328@做for date in sorted(date_to_latlng): writer.writerow(date_to_latlng[key])
  • 您好鲍里斯,再次感谢您的回答。我的代码如下所示: 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, "some string", "some其他字符串"] 与 open("test.csv", "w", newline="") 作为 csvfile: writer = csv.writer(csvfile, delimiter=",") for date in sorted(date_to_latlng): writer.writerow (date_to_latlng[latlng])
  • 不幸的是,我不能只将坐标(按日期排序)写入文件 test.csv。坐标应按日期排序并写入文件 test.csv,即使日期不包含在文件 test.csv 中。文件 test.csv 应该只包含坐标,然后是一些字符串: Contents test.csv 示例:49.195660595 -122.5059605950 String1 String2 你对我做错了什么有什么提示吗?
  • writer.writerow(date_to_latlng[latlng]) 应该是 writer.writerow(date_to_latlng[date])
猜你喜欢
  • 2018-10-18
  • 2019-07-21
  • 2014-07-06
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 2010-12-18
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多