在python中导出到csv

时间:2016-08-08 19:40:23

标签: python csv export increment

我有以下情况: 我需要在csv文件中获取一个功能的时间,并将其与某人拍摄的照片的时间进行比较。 然后我需要找到2个(或更少)匹配。我将从功能时间到该功能的2分钟间隔内分配我找到的前两张图片。 我设法创建了两个包含详细信息的词典:feature_hours包含id和功能的时间。 photo_hours包含photo_path和照片的时间。 sorted_featuresorted_photo是对两个词典进行排序的两个列表。 问题是在输出csv文件中我只完成了84行,有些是空白的。功能csv文件有199个功能。我想我经常增加j。但我需要一个专业人士的清晰外观,因为我无法弄明白。 这是代码:

j=1
sheet1.write(0,71,"id")
sheet1.write(0,72,"feature_time")
sheet1.write(0,73,"Picture1")
sheet1.write(0,74,"Picture_time")
sheet1.write(0,75,"Picture2")
sheet1.write(0,76,"Picture_time")
def write_first_picture():

    sheet1.write(j,71,feature_time[0])
    sheet1.write(j,72,feature_time[1])
    sheet1.write(j,73,photo_time[0])
    sheet1.write(j,74,photo_time[1])

def write_second_picture():

    sheet1.write(j-1,75,photo_time[0])
    sheet1.write(j-1,76,photo_time[1])

def write_pictures():

    if i==1:

        write_first_picture()
    elif i==2:
        write_second_picture()

for feature_time in sorted_features:
    i=0
    for photo_time in sorted_photo:
        if i<2:
            if feature_time[1][0]==photo_time[1][0]:
                if feature_time[1][1]==photo_time[1][1]:
                    if feature_time[1][2]<photo_time[1][2]:
                        i=i+1
                        write_pictures()
                        j=j+1
                    elif int(feature_time[1][1])+1==photo_time[1][1]:
                        i=i+1
                        write_pictures()
                        j=j+1
                    elif int(feature_time[1][1])+2==photo_time[1][1]:
                        i=i+1
                        write_pictures()
                        j=j+1
                    elif int(feature_time[1][0])+1==photo_time[1][0]:
                        if feature_time[1][1]>=58:
                            if photo_time[1][1]<=02:
                                i = i+1
                                write_pictures() 
                                j=j+1

编辑:以下是两个列表的示例: 功能列表:[(' - 70',('10','27','03')),(' - 73',('10','29','50'))] 照片列表:[('20160801_125133-1151969393.jpg',('12','52','04')),(''20160801_125211342753906.jpg',(''12','52','16'))]

1 个答案:

答案 0 :(得分:0)

python有一个CSV模块可以帮助加载这些文件。您可以对结果进行排序,以便更有效/短路检查。我无法确定i和j变量的含义,但我很确定你可以做如下的事情:

import csv

def hmstoseconds(hhmmss):
    # 60 * 60 seconds in an hour, 60 seconds in a min, 1 second in a second
    return sum(x*y for x, y in zip(hhmmss, (60*60, 60, 1)))

features = []
# features model looks like tuple(ID, (HH, MM, SS))
with open("features.csv") as f:
    reader = csv.reader(f)
    features = list(reader)

photos = []
# photos model looks like tuple(filename, (HH, MM, SS))
with open("photos.csv) as f:
    reader = csv.reader(f)
    photos = list(reader)

for feature in features:
    for photo in photos:
        # convert HH, MM, SS to seconds and find within 2 min (60s * 2)
        # .. todo:: instead of nested for loops, we could use filter()
        if abs(hmstoseconds((feature[1]) - hmstoseconds(photo[1])) <=(60 * 2):
            # the photo was taken within 2 min of the feature
            <here, write a photo>

为了使其更易于维护/读取,您还可以使用namedtuples来更好地表示数据模型:

import csv
from collections import namedtumple

# model definitions to help with readability/maintainence
# if the order of the indices changes or we add more fields, we just need to 
# change them directly here instead of tracking the indexes everywhere
Feature = namedtuple("feature", "id, date")
Photo = namedtuple("photo", "file, date")

def hmstoseconds(hhmmss):
    # 60 * 60 seconds in an hour, 60 seconds in a min, 1 second in a second
    return sum(x*y for x, y in zip(hhmmss, (60*60, 60, 1)))

def within_two_min(date1, date2):
    # convert HH, MM, SS to seconds for both dates
    # return whether the absolute difference between them is within 2 min (60s * 2)
    return abs(hmstoseconds(date1) - hmstoseconds(date2)) <= 60 * 2 

if __name__ == '__main__':
    # using main here means we avoid any nasty global variables
    # and only execute this code when this file is run directly
    features = []
    with open("features.csv") as f:
        reader = csv.reader(f)
        features = [Feature(f) for f in reader]

    photos = []
    with open("photos.csv) as f:
        reader = csv.reader(f)
        photos = [Photo(p) for p in reader]

    for feature in features:
        for photo in photos:
            # .. todo:: instead of nested for loops, we could use filter()
            if within_two_min(feature.date, photo.date):
                <here, write a photo>

希望这能让你朝着正确的方向前进。我不完全理解你试图用i和j以及第一个/第二个“write_picture”做什么,但希望你能更好地理解python中的范围和访问。