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

 更新时间:2021年10月21日 10:10:37   作者:Fourier_1024  
这篇文章主要介绍了python常用数据文件处理方法,虽说python运行速度慢,但其编程速度,第三方包的丰富度是真的高,涉及到文件批处理还是会选择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数据文件处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python集合之set和frozenset的使用详解

    Python集合之set和frozenset的使用详解

    目前Python有两种内置集合类型:set和frozenset,其中set 是可变的,而frozenset 是不可变的。本文将通过示例详细讲解二者的使用,感兴趣的小伙伴可以了解一下
    2022-04-04
  • python调用java的Webservice示例

    python调用java的Webservice示例

    这篇文章主要介绍了python调用java的Webservice具体方法,包含java端和python实现代码,需要的朋友可以参考下
    2014-03-03
  • Python实现一个转存纯真IP数据库的脚本分享

    Python实现一个转存纯真IP数据库的脚本分享

    工作中我们常需要使用纯真IP数据库内的数据做分析,下面这篇文章主要给大家介绍了利用Python如何实现一个转存纯真IP数据库的相关资料,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Django中celery执行任务结果的保存方法

    Django中celery执行任务结果的保存方法

    今天小编就为大家分享一篇Django中celery执行任务结果的保存方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • VSCODE配置Markdown及Markdown基础语法详解

    VSCODE配置Markdown及Markdown基础语法详解

    这篇文章主要介绍了VSCODE配置Markdown及Markdown基础语法详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • python 读取.nii格式图像实例

    python 读取.nii格式图像实例

    这篇文章主要介绍了python 读取.nii格式图像实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • python中的断言(assert语句)

    python中的断言(assert语句)

    这篇文章主要介绍了python中的断言(assert语句),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 在Python中增加和插入元素的示例

    在Python中增加和插入元素的示例

    今天小编就为大家分享一篇在Python中增加和插入元素的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 利用Python requests库爬取高德地图全国地铁站点信息

    利用Python requests库爬取高德地图全国地铁站点信息

    requests 模块是 python 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库,它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求,这篇文章主要介绍了利用Python requests库爬取高德地图全国地铁站点信息,需要的朋友可以参考下
    2024-03-03
  • python pandas消除空值和空格以及 Nan数据替换方法

    python pandas消除空值和空格以及 Nan数据替换方法

    今天小编就为大家分享一篇python pandas消除空值和空格以及 Nan数据替换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10

最新评论