浅析python常用数据文件处理方法

0.前言

虽说python运行速度慢,但其编程速度,第三方包的丰富度是真的高。
涉及到文件批处理还是会选择python。

1. 动态文件名

在文件批处理中,文件名经常只有编号是不同的,可以通过给字符串传递不同的编号来获取动态文件名。

file_num = 324
# file_num = 1
for i in range(file_num):
	file_name = "正常数据\\{}.正常.txt".format(i + 1)
	...

2. 将文件转换为csv格式

一般数据提供者为了节省存储空间,都会通过规定的格式存储到txt文件中,这种格式对计算机可能并不友好。而逗号文件csv格式可以轻松被numpy、pandas等数据处理包读取。
首先通过逐行读取获取每行数据(大部分数据文件都是每行格式相同,如果数据只有一行,可以全部读取或者逐字符读取),之后通过line.replace('\n', ‘')将每行的换行符删除,以免最后得到的csv文件有空行。
使用line.split(':')将字符串分解为多个字段。
通过csv.writer写入整行。

import csv
outFile = open(file_path + outFile_name, 'w', encoding='utf-8', newline='' "")
csv_writer = csv.writer(outFile)
with open(file_path + file_name, "r") as f:
    index = 0
    for line in f:
        # 写入表头
        if index == 0:
            csv_writer.writerow(['T', 'TimeStamp', 'RangeReport', 'TagID', 'AnchorID',
                                 'ranging', 'check', 'SerialNumber', 'DataID'])
            index = index + 1
            continue
        line = line.replace('\n', '')
        str = line.split(':')
        csv_writer.writerow(str)

3. 初步处理csv文件

一开始得到的csv文件往往是我们不想要的,需要进行简单的处理。
例如我想将四行数据合并为一行。
使用pandas读取csv文件为一个表df。将希望生成的格式简单做一个有标题、有一行数据的文件,读取为另一个表df2.
可以使用

del df['T']

来删除指定的列。

可以通过

df2.loc[row] = list

来确定新文件的一行数据。pandas访问行数据

import pandas as pd

df = pd.read_csv(file_path + file_name)
# 删除某些列
del df['T']
del df['RangeReport']
del df['TagID']

# 判断同一DataID对应的SerialNumber是否相同
# SerialNumberBegin = df['SerialNumber'][0]
# DataIDBegin = df['DataID'][0]
# for row in range(df.shape[0]):
#     c = df['SerialNumber'][row] != (SerialNumberBegin + int(row / 4)) % 256
#     d = df['DataID'][row] != DataIDBegin + int(row / 4)
#     e = df['AnchorID'][row] != row % 4
#     if c | d | e:
#         print('err')
del df['AnchorID']

# print(type(df['TimeStamp'][0]))
# 进行表合并
df2 = pd.read_csv(file_path + "合并格式.csv")
for row in range(int(df.shape[0]/4)):
    list = [3304,229,90531088,90531088,90531088,90531088,760,760,760,760,760,760,760,760]
    # DataID,SerialNumber,TimeStamp0,TimeStamp1,TimeStamp2,TimeStamp3,ranging0,check0,ranging1,check1,ranging2,check2,ranging3,check3
    list[0] = df['DataID'][row*4]
    list[1] = df['SerialNumber'][row*4]
    list[2] = df['TimeStamp'][row*4+0]
    list[3] = df['TimeStamp'][row*4+1]
    list[4] = df['TimeStamp'][row*4+2]
    list[5] = df['TimeStamp'][row*4+3]
    list[6]  = df['ranging'][row*4+0]
    list[7]  = df['check'][row*4+0]
    list[8]  = df['ranging'][row*4+1]
    list[9]  = df['check'][row*4+1]
    list[10] = df['ranging'][row*4+2]
    list[11] = df['check'][row*4+2]
    list[12] = df['ranging'][row*4+3]
    list[13] = df['check'][row*4+3]

    df2.loc[row] = list
df2.to_csv(file_path+contact_name)

4. 获取部分数据

可以通过

df0 = df.iloc[:, 3:7]

或者

df0 = df[["check0","check1","check2","check3"]]

来获取一个表的某几列。

5. 数据间的格式转换

一般会在list、numpy、pandas三种格式间进行数据转换。
自己创建数据时,经常使用

y_show = []
y_show.append(n_clusters_)

维度调整好后,可以是一维或者多维,再转换为numpy或者pandas。
其中转换成numpy的方法如下

y = np.array(y_show)

6. 离群点、重合点的处理

使用DBSCAN算法进行聚类。具体算法描述随便搜就有。
有两个重要参数,一个是聚类半径,另一个是最小邻居数。
指定较大半径以及较大邻居数可以筛选出离散点。
指定较小半径可以筛选出重合点、相似点。
代码如下,使用一个n*m的numpy矩阵作为输入,对m维的点进行聚类。
通过一通操作获取labels,是一个map,key值为int数值,-1,0,1,2…。-1代表离群点,其他代表第几簇。value是一个list,代表各簇的点的下标。

from sklearn.cluster import DBSCAN

y = df[["d0","d1","d2","d3"]].to_numpy()

db = DBSCAN(eps=3, min_samples=2).fit(y)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_

# 统计簇中labels的数量
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

7. 数据绘制

绘制二维的比较简单,这里只贴上三维绘制代码

import matplotlib.pyplot as plt
import pandas as pd

from mpl_toolkits.mplot3d import axes3d

df = pd.read_csv(file_path+file_name)
x1 = df["x"].to_numpy()
y1 = df["y"].to_numpy()
z1 = df["z"].to_numpy()

df = pd.read_csv(file_path+file_name2)
x2 = df["x"].to_numpy()
y2 = df["y"].to_numpy()
z2 = df["z"].to_numpy()

# new a figure and set it into 3d
fig = plt.figure()
ax = fig.gca(projection='3d')

# set figure information
# ax.set_title("3D")
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")

# draw the figure, the color is r = read
# figure1 = ax.plot(x1, y1, z1, c='b')
figure2 = ax.plot(x2, y2, z2, c='r')
# figure3 = ax.plot(x3, x3, z3, c='g')
# figure4 = ax.plot(x4, x4, z4, c='y')

ax.set_xlim(0, 7000)
# ax.set_ylim(0, 5000)
ax.set_zlim(0, 3000)

plt.show()

8. numpy的矩阵运算

# 转换数据类型
Zk = Zk.astype(float)
# 范数 a,b是维度相同的向量
np.linalg.norm(a-b)
# 矩阵乘法
np.matmul(A, B)
# 矩阵求逆
np.linalg.inv(A)
# 单位阵
np.eye(dims)
# 转置
Zk = Zk.T

9. 保存文件

可以使用csv writerow存文件,见1.
也可以使用numpy或者pandas保存文件。
如果直接使用pandas的

df2.to_csv(file_path+contact_name)

保存文件,会额外保存一行index。可以通过参数,index=False来控制。
如果还有其他要求可以查阅pd.to_csv

也可使用numpy,将一个numpy类型数据通过指定格式存文件。这里一般要指定格式,否则有可能会存成自己不希望的类型。

np.savetxt(file_path + "异常数据.txt", np.array(y_show,dtype=np.int16), fmt="%d")

到此这篇关于python常用数据文件处理方法的文章就介绍到这了,更多相关python数据文件处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python3按一定数据位数格式处理bin文件的方法

    因为研究生阶段经常用MATLAB作图,处理数据,但是MATLAB太过于庞大,不方便,就想用python处理. 问题:我们通常处理的最原始的数据是bin文件,打开后如下所示,是按16进制形式存储的. MATLAB处理时,是按照如下方式读取前10个数,int32数据格式,上图中的红色圈表示MATLAB读取的一个数据,前10个数据表示元数据. MATLAB读取的前10个数据的结果: 而Python中似乎没有可以在指定数据格式位数下读取bin文件中数据,例如想以python中的read()读取时,图一中

  • 对python .txt文件读取及数据处理方法总结

    1.处理包含数据的文件 最近利用Python读取txt文件时遇到了一个小问题,就是在计算两个np.narray()类型的数组时,出现了以下错误: TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U3') dtype('<U3') dtype('<U3') 作为一个Python新手,遇到这个问题后花费了挺多时间,在网上找了许多大神们写的例子,最后终于解决了. 总

  • Python使用Pandas对csv文件进行数据处理的方法

    今天接到一个新的任务,要对一个140多M的csv文件进行数据处理,总共有170多万行,尝试了导入本地的MySQL数据库进行查询,结果用Navicat导入直接卡死....估计是XAMPP套装里面全默认配置的MySQL性能不给力,又尝试用R搞一下吧结果发现光加载csv文件就要3分钟左右的时间,相当不给力啊,翻了翻万能的知乎发现了Python下的一个神器包:Pandas(熊猫们?),加载这个140多M的csv文件两秒钟就搞定,后面的分类汇总等操作也都是秒开,太牛逼了!记录一下这次数据处理的过程: 使用

  • Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)

    最近在弄一个项目分析的时候,看到有一个后缀为".sqlite"的数据文件,由于以前没怎么接触过,就想着怎么用python来打开并进行数据分析与处理,于是稍微研究了一下. SQLite是一款非常流行的关系型数据库,由于它非常轻盈,因此被大量应用程序采用. 像csv文件一样,SQLite可以将数据存储于单个数据文件,以便方便的分享给其他人员.许多编程语言都支持SQLite数据的处理,python语言也不例外. sqlite3是python的一个标准库,可以用于处理SQLite数据库. 用s

  • 浅析python常用数据文件处理方法

    0.前言 虽说python运行速度慢,但其编程速度,第三方包的丰富度是真的高. 涉及到文件批处理还是会选择python. 1. 动态文件名 在文件批处理中,文件名经常只有编号是不同的,可以通过给字符串传递不同的编号来获取动态文件名. file_num = 324 # file_num = 1 for i in range(file_num): file_name = "正常数据\\{}.正常.txt".format(i + 1) ... 2. 将文件转换为csv格式 一般数据提供者为了

  • python数据处理之如何选取csv文件中某几行的数据

    前言 有些人看到这个问题觉得不是问题,是嘛,不就是df.col[]函数嘛,其实忽略了一个重点,那就是我们要省去把csv文件全部读取这个过程,因为如果在面临亿万级别的大规模数据,得到的结果就是boom,boom,boom. 我们要使用一下现成的函数里面的参数nrows,和skiprows,一个代表你要读几行,一个代表你从哪开始读,这就可以了,比如从第3行读取4个 示例代码 import pandas as pd df = pd.DataFrame({'a':[1,2,3,4,5,6,7,8,9],

  • python处理xml文件的方法小结

    本文实例讲述了python处理xml文件的方法.分享给大家供大家参考,具体如下: 前一段时间因为工作的需要,学习了一点用Python处理xml文件的方法,现在贴出来,供大家参考. xml文件是按节点一层一层来叠加的,最顶层的是根节点.比如说: <sys:String x:Key="STR_License_WithoutLicense">Sorry, you are not authorized.</sys:String> 其中sys:String为节点名字,x:

  • Python读写docx文件的方法

    Python读写word文档有现成的库可以处理.我这里采用 python-docx.可以用pip install python-docx安装一下. 这里说一句,ppt和excel也有类似的库哦,而且是直接读取文件里面的xml数据.所以doc格式得另找其他库处理,doc格式不是基于xml的. 帮助文档:http://python-docx.readthedocs.org/en/latest/ 1.新建或打开文件.这个比较简单用docx的Document类,若指定路径则是打开文档:若没有指定路径则是

  • Python读写压缩文件的方法

    问题 你想读写一个gzip或bz2格式的压缩文件. 解决方案 gzip 和 bz2 模块可以很容易的处理这些文件. 两个模块都为 open() 函数提供了另外的实现来解决这个问题. 比如,为了以文本形式读取压缩文件,可以这样做: # gzip compression import gzip with gzip.open('somefile.gz', 'rt') as f: text = f.read() # bz2 compression import bz2 with bz2.open('so

  • Python常用数据结构和公共方法技巧总结

    目录 1. 列表 1.1 列表的定义 1.2 列表常用操作 1.3 循环遍历 1.4 应用场景 2. 元组 2.1 元组的定义 2.2 元组常用操作 2.3 循环遍历 2.4 应用场景 3. 字典 3.1 字典的定义 3.2 字典常用操作 3.3 循环遍历 3.4 应用场景 4. 字符串 4.1 字符串的定义 4.2 字符串的常用操作 1) 判断类型 2) 查找和替换 3) 大小写转换 4) 文本对齐 5) 去除空白字符 6) 拆分和连接 4.3 字符串的切片 4.4 字符串的格式化输出 5.

  • Python写入CSV文件的方法

    本文实例讲述了Python写入CSV文件的方法.分享给大家供大家参考.具体如下: # _*_ coding:utf-8 _*_ #xiaohei.python.seo.call.me:) #win+python2.7.x import csv csvfile = file('csvtest.csv', 'wb') writer = csv.writer(csvfile) writer.writerow(['id', 'url', 'keywords']) data = [ ('1', 'http

  • C#使用GZipStream解压缩数据文件的方法

    本文实例讲述了C#使用GZipStream解压缩数据文件的方法.分享给大家供大家参考.具体分析如下: GZipStream用于从一个流读取数据写入到另一个流,GZipStream不能写入到其它的资源,比如文件或者内存,只能从流到流. GZipStream使用的一般流程如下: 打开一个现有的文件  打开/创建输出文件  创建GZipStream对象  逐字节读源文件,并把它传递到GZipStream  使用GZipStream写入到输出文件流 String sourcefilename = FIL

  • Python读写ini文件的方法

    本文实例讲述了Python读写ini文件的方法.分享给大家供大家参考.具体如下: 比如有一个文件update.ini,里面有这些内容: [ZIP] EngineVersion=0 DATVersion=5127 FileName=dat-5127.zip FilePath=/pub/antivirus/datfiles/4.x/ FileSize=13481555 Checksum=6037,021E MD5=aaeb519d3f276b810d46642d782d8921 那就可以通过下面这些

  • Python读写unicode文件的方法

    本文实例讲述了Python读写unicode文件的方法.分享给大家供大家参考.具体实现方法如下: #coding=utf-8 import os import codecs def writefile(fn, v_ls): f = codecs.open(fn, 'wb', 'utf-8') for i in v_ls: f.write(i + os.linesep) f.close() def readfile(fn): f = codecs.open(fn,'r','utf-8') ls =

  • python简单分割文件的方法

    本文实例讲述了python简单分割文件的方法.分享给大家供大家参考.具体如下: 有的网站在上传文件时对文件大小有限制,因此可以将大文件分割成多个小文件再上传. #!/usr/bin/env python def split(filename, size): fp = open(filename, 'rb') i = 0 n = 0 temp = open(filename+'.part'+str(i),'wb') buf = fp.read(1024) while(True): temp.wri

随机推荐