很多时候,我们实际得到的数据离我们需要的数据总是有着一定的差距,这就需要进行数据清洗。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文件已有它的作用。
网友评论