美文网首页python 杂谈Python
python-轻松将txt文件内容写入csv文件

python-轻松将txt文件内容写入csv文件

作者: 思想永不平凡 | 来源:发表于2019-11-20 23:34 被阅读0次

    很多时候,我们实际得到的数据离我们需要的数据总是有着一定的差距,这就需要进行数据清洗。python的pandas在数据处理方面有着巨大的优势,今天我们的任务是将txt文件的内容写入到csv文件中


    前言

    网上的教程有很多,然鹅,本人在实际处理这个问题时,却没有能够完美解决问题的教程。就其原因,有的是教程本身“误人子弟”,也有的是自己的实际情况与教程中的不符合罢了。
    也许,这个过程看似简单,但是实际上会有各种各样的问题,比如说编码,写入到csv文件的格式与预期不一致,程序不具有普遍性等等问题
    那么现在,我就给出一个比较”通用的“方法吧,能够尽可能处理多种问题

    需要的参数有文件路径,txt文件内容之间的分隔符,txt文件内每列的列名(可不需要,但是有的话,便于阅读)

    相关的注意事项,我都在程序中以注释的形式给出了
    展现程序:

    # -*- coding: utf-8 -*-
    
    import os
    import csv
    import pandas
    
    class BeforeTest(object):
        def __init__(self, path, separator, list_name):
            """
            :param path: 文件路径txt文件
            :param separator: 文件分隔符
            :param list_name : 列名
            """
            '''文件路径'''
            self.file_path = path
            '''文件分隔符'''
            self.separator = separator
            '''列名'''
            self.list_name = list_name
            '''函数'''
            self.deal_data()
    
        def gain_extension(self):
            """
            :return:
            @file_path : 返回文件路径
            @shot_name : 返回文件名
            @extension : 返回文件后缀
            """
            file_path, temp_filename = os.path.split(self.file_path)
            shot_name, extension = os.path.splitext(temp_filename)
            return file_path, shot_name, extension
    
        def deal_data(self):
            _path, shot_name, extension = self.gain_extension()
            '''生成的csv文件的完整路径'''
            new_path = _path + '/' + shot_name + '.csv'
            new_file = open(new_path, 'w+', newline='')
            writer = csv.writer(new_file)
            '''先将列名写入'''
            writer.writerow(self.list_name)
            data = open(self.file_path)
            lines = data.readlines()
            for index in range(len(lines)):
                lines[index] = lines[index].strip('\n')
                lines[index] = lines[index].split(self.separator)
                writer.writerow(lines[index])
            data.close()
            new_file.close()
            self.file_path = new_path
    
    

    下面来看下实际效果:
    这是一个txt文件


    图片.png

    运行程序:

    
    if __name__ == '__main__':
        '''改成你自己的文件路径
        生成的csv文件是与txt文件同名同目录'''
        path = 'data_set/australian.txt'
        test = BeforeTest(path,
                          ' ', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
    

    这里为了简便起见,列名用了数字表示。
    看看结果吧


    图片.png
        data = pandas.read_csv('data_set/australian.csv')
        print(data)
    
    图片.png

    再看一个例子吧


    图片.png

    来自于《机器学习实战》中knn的例子

    运行程序:

    if __name__ == '__main__':
        path = 'G:/桌面文档/codes/Machine-Learning-master/Machine-Learning-master/kNN/2.海伦约会/datingTestSet.txt'
        # path = 'data_set/australian.txt'
        test = BeforeTest(path,
                          '\t', ['a', 'b', 'c', 'd'])
    

    结果如下:


    图片.png

    BeforeTest类的构造参数有三个,path: 文件路径txt文件,separator: 文件分隔符,list_name : 列名
    基本上有了这三个参数,就可以将txt文件转换为csv文件了

    补充:感谢评论区的大佬给出了一种更简单的方法,就是用pandas自带的方法,这里,我直接在deal_data上面更改了。
    程序如下:

    def deal(self):
        data = pandas.read_table(self.file_path, sep = self.separator, names = self.list_name)
        _path, shot_name, extension = self.gain_extension()
        '''生成的csv文件的完整路径'''
        new_path = _path + '/' + shot_name + '.csv'
        data.to_csv(new_path, index = 0)
    

    read_table和to_csv都有一些参数,这里简单介绍下部分参数

    read_table:
    path_or_buf : str或文件句柄,默认为无
    sep : str,默认','
    header : bool或str列表,默认为True
    index : bool,默认为True
    mode : str,Python写入模式,默认为“ w”。
    encoding : str,可选
    表示输出文件中使用的编码的字符串,默认为'utf-8'。

    to_csv:
    filepath_or_buffer : str,路径对象或类似文件的对象
    sep : str,默认'\ t'(制表位)
    header : int,int列表,默认为'infer'
    行号(用作列名)以及数据的开头。默认行为是推断列名:如果未传递名称,则行为与相同,header=0并且从文件的第一行推断出列名;如果显式传递列名,则行为与相同 header=None。显式传递header=0以能够替换现有名称。
    names : 类 数组,可选,要使用的列名列表。如果文件不包含标题行,则应显式传递header=None。此列表中不允许重复。

    也不是说第一种方法就没有意义了,如果txt文件中有一些其他情况,如:


    image.png

    如果使用第二种方法,就会是这样了:


    image.png

    第一种方法可以去除每一行的 " 字符,对”不完美“的txt文件已有它的作用。

    相关文章

      网友评论

        本文标题:python-轻松将txt文件内容写入csv文件

        本文链接:https://www.haomeiwen.com/subject/aznaictx.html