文本型文件是常见的可以用来存储数据的文件,使用文本文件存储数据的优点在于直视、存取方便,不足之处在于数据量达到一定规模之后,读写和检索的速度会变得较为缓慢。
常见的存储文本数据的文本文件主要有两种;
1)、一种是基于分隔符的文本数据文件,分隔符可以是空格、逗号、单双引号、TAB制表符等,使用分隔符可以将同一行数据的不同字段分开,便于以统一的规律读写;
2)、一种是基于JSON格式的文本文件,可以联想到Python的字典类型,因为Python可以使用JSON中的 “键” 来读写对应的数据。
此类文本数据文件以 “行” 为各条数据的分隔,以 “各种分隔符” (同一个文本数据文件通常只使用一种分隔符)作为一条数据内不同 “列/字段” 的分隔,存储需要处理的数据。如下分别使用空格、逗号等分隔符:
不同分隔符对存储的数据没有本质上的影响,只是文件的观感不同,在Python中读写基于分隔符的文本数据文件一般有3种方法:
以使用 “空格”为分隔符的文本数据文件为例,文件名为 “TXT_Space.txt” 的文本文件中存在以下数据:
import csv
if __name__ == '__main__':
# 通过CSV模块,读取文件的内容
with open("TXT_Space.txt") as cf:
lines=csv.reader(cf)
for line in lines:
print(line)
''' 结果如下:
['A B']
['1 2']
['3 4']
'''
1.2、使用 CSV 模块将数据写入文本文件:
注:CSV模块默认使用的是逗号分隔 ,也支持使用制表符分隔。其他的分隔符需要自定义,然后调用 register_dialect() 方法来注册使用。可以使用 list_dialects() 方法来查询已注册的所有编码列表。
使用 loadtxt() 函数进行读取操作,语法如下:
loadtxt(fname, dtype=, comments='#', delimiter=None, converters=None, skiprows=0. usecols=None, unpack=False, ndmin=0, encoding='bytes')
Numpy库读取的结果和CSV模块的结果不同,Numpy库读取的结果最外层多了一对方括号,且每个list中间没有逗号;因为使用 Numpy 库读取的结果的数据类型是 ndarray , 与使用CSV模块读取得到的数据类型list不同,使用 type() 函数可以查看变量 A 的类型。
import numpy
if __name__ == '__main__':
# 通过 numpy 库读取文件中的数据
A = numpy.loadtxt("TXT_Space1.txt", dtype=str, delimiter=",", unpack=False)
print(A)
print(type(A)) # ,查看变量A的类型
'''
结果如下:
[['a' 'b']
['1' '4']
['2' '5']
['3' '6']]
'''
2.2、将数据写入文本数据文件:
使用 savetxt() 函数可以实现,其语法如下:
savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='n', header='', footer='', comments='# ', encoding=None )
import numpy as py
if __name__ == '__main__':
# 通过 numpy 库写入文本数据文件
data = [['A', 'B'], ['1', '2'], ['3', '4'], ['5', '6']]
py.savetxt('TXT_Space2.txt', data, delimiter=',', newline='rn', fmt='%s,%s')
运行代码后,生成了名为 “TXT_Space.txt” 的文本文件,如下:
import pandas as pd
if __name__ == '__main__':
B = pd.read_csv('TXT_Space2.txt')
print(B)
'''
结果为:
A B
0 1 2
1 3 4
2 5 6
'''
3.2、写入
import pandas as pd
if __name__ == '__main__':
# 使用 pandas 库写入文件
C = pd.read_csv('TXT_Space2.txt')
C.to_csv('TXT_Space3.txt')
注:使用 CSV模块、numpy库 和 pandas 库处理文本文件的区别:
1)、所需组件的支持程度不同。CSV模块是 Python 内置的,可以直接调用;numpy 库和 pandas库 都需要联网安装,而且 pandas库依赖于 numpy库。
2)、读取数据以后得到的数据类型,以及写入文件后的数据格式不同。
3)、主要功能和运行效率不同。CSV模块主要用于处理文本型数据的读写;而 pandas和 numpy 的功能比 CSV模块强大很多,numpy库主要面向高精度和高性能的计算,提供了大量相关函数;pandas库多用于时间序列化,可以方便、快速处理大量连续型数据。
二、基于 JSON 格式的文本文件JSON 是一种轻量型的数据交换格式,易于阅读和编写,也易于机器解析和生成。在 Python 中读写 JSON格式的文本文件一般有两种:
1、使用 json 模块读写Python 内置了处理 JSON 的 json 模块,可以直接处理字符串、整型、浮点型、列表、元组、字典等类型的数据。
1.1、将 Python 原始数据类型转换为 JSON 类型的过程称为 “序列化”序列化前后的对应类型关系如下:
下面是一个序列化例子:
import json
if __name__ == '__main__':
obj = [[1, 2, 3], 123, 123.11, 'abc', {'key1': (1, 2, 3), 'key2': (4, 5, 6)}]
fp = open('test.json', 'w')
json.dump(obj, fp)
fp.close()
生成一个 test.json 文件:
反序列化前后的对应类型关系如下:
import json
if __name__ == '__main__':
# 反序列化
ob = json.load(open('test.json'))
print(ob) # [[1, 2, 3], 123, 123.11, 'abc', {'key1': [1, 2, 3], 'key2': [4, 5, 6]}]
2、使用 pandas库读写
2.1 、自定义 “test1.json” 文件,使用 pandas库 读取该文件数据,如下:
import pandas as pd
if __name__ == '__main__':
# 使用pandas库读取json文件
A = pd.read_json('test1.json')
print(A)
'''结果如下:
a b c
0 1 2 3
'''
Pandas 读取的 JSON 数据将会创建 Dataframe 对象,若直接传入标量的字典则需要写入索引,因此需要为标量值加上方括号,表示这是列表值,否者将会报 ValueError 错误。
2.2 、用 Pandas 库将Python列表数据写入 test2.json 文件import pandas as pd
if __name__ == '__main__':
# 用 pandas 库将python列表数据写入 test2.json
B = pd.Dataframe([['D', 11], ['E', 22], ['F', 33]])
fp = open('test2.json', 'w')
fp.write(B.to_json(force_ascii=False))
fp.close()



