python处理txt文件和csv文件

写在前面:因为做实验,需要对数据集进行一定的处理,所以需要python写一个脚本来处理。水平有限,能用就行,也许之后会优化一下。

本文适合对slam实验中的kitti、euroc等数据集进行与处理

首先,了解文件操作函数

f=open('01.txt')
#open会返回来一个和对象f
line=f.readline()
#该函数会一行一行的读取文件,而且返回的类型是字符串
lines=readlines()
#这个函数读取整个文件,并且返回的数据类型是一个列表
f.close()
#对文件操作完毕之后,要使用函数将文件关闭
with open('01.txt','r) as read_file:
    statement
#使用with打开文件不用再去考虑关闭文件的事,可以更加专注对文件本身的操作,在对文件操作完成之后会自动关闭文件

接下来,使用上述函数对文件进行进行操作。

一、将txt文件的第一列改成时间戳

#该函数用来将grountruth.txt文件的第一列改为时间戳,即从0到n,并将改名之后的文件存储的哦呵all.#txt文件中
path = '/home/grountruth.txt'
path_save = '/home/yi/ex/eurocMH_04/all.txt'
with open(path, 'r') as read_file, open(path_save, 'w') as write_file:
    data = read_file.readlines()
    i = 0
    for line in data:
        line.split(' ')[1:9]
        mydata = str(i) + ' ' + line.split(' ')[1] + ' ' + line.split(' ')[2] + ' ' + line.split(' ')[3] + ' ' + \
                 line.split(' ')[4] + ' ' + line.split(' ')[5] + ' ' + line.split(' ')[6] + ' ' + line.split(' ')[
                     7] + ' ' + line.split(' ')[8]
        i = i + 1
        print(mydata, file=write_file, end="")

二、给图像进行批量改名

import os

def Rename(dir, filedir):
    file = open(dir, "r")
    timestamp = list()
    a = os.listdir(filedir)
    a.sort()
    for line, img_name in zip(file.readlines(), a):
        os.rename("data/" + img_name, "/home/yi/ex/eurocMH_04/cam0/data/" + line.split()[0])

    file.close()


if __name__ == '__main__':
    Rename('/home/image_name_format.txt', '/home/cam0/data/')
    #第一个参数时存储图片名称的文件
    #第二个参数时存储图片的文件夹

三、寻找最匹配的时间戳,暴力匹配

#问题描述,许多数据集给出的groundtruth与图片并非是一一对应的,而是会给出许多的groundtruth,所以我们应该找到距离所用图片时间戳所对应的groundtruth时间戳之间的最短距离,这个groundtruth也就是图片所对应的时间戳
# 该文件用来找到距离图片最近的时间戳

path_image_name = '/home/image_name.txt'
path_txt_all = '/home4/groundtruth.txt'
path_truth_right = '/home//right_grountruth.txt'

with open(path_txt_all, 'r') as txt_file, open(path_image_name, 'r') as image_file, open(path_truth_right,
                                                                                         'w') as write_file:
    image_data = image_file.readlines()
    txt_data = txt_file.readlines()

    for image_line in image_data:
        min = 100000000000
        data = int(image_line)
        # print('data')
        # print(data)
        for txt_line in txt_data:
            txt = int(txt_line.split(' ')[0])
            if abs(txt - data) < min:
                min = abs(txt - data)
                my_data = txt_line
                #print('mydata')
                #print(my_data)
        print(my_data, file=write_file, end="")

四,拼接两个txt文件

# 该文件用来将旋转和平移变量两个文件联结起来

path2 = '/home/tran.txt'  
path1 = '/home/calqua.txt'
path_all = '/home/all.txt'# 保存拼接之后的文件

with open(path1, 'r') as read_filex, open(path2, 'r') as read_filey, open(path_all, 'w') as write_file:
    linex = read_filex.readlines()
    liney = read_filey.readlines()
    for i in range(len(linex)):
        line = linex[i].strip() + ' ' + liney[i]
        print(line,file=write_file,end="")

综上:

对txt文件操作,主要注意的点是,readlines函数返回的是一个列表,可以对这个列表进行遍历,当需要这个列表中的内容是,需要对其进行分割操作,写清楚分割符是什么。

接下来对csv文件操作,与txt文件异曲同工。可以使用python中的csv库来操作,注意事项如下:

'''

语法:csv.writer(f):

writer支持writerow(列表)单行写入,和writerows(嵌套列表)批量写入多行,无须手动保存。

语法:csv.reader(f, delimiter=‘,’)

reader为生成器,每次读取一行,每行数据为列表格式,可以通过delimiter参数指定分隔符

返回一个reader对像,对该对象进行遍历

'''

你可能感兴趣的:(python)