python 杂谈Python

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

2019-11-20  本文已影响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文件已有它的作用。

上一篇下一篇

猜你喜欢

热点阅读