Python-列表、字典存取txt、csv、xls/xlsx、npy
前言
本文主要记录Python-实现文件存取的相关笔记,涉及到列表、字典类型的数据如何保存到npy、txt、csv、xsl、xslx格式的文件,所有操作都有源码附在下方,且有大量的源码配套生成结果图示,可以适应大多数情况下存取文件需求。
1. 列表
列表将以一维和二维列表为例进行举例,二维可以通多维,融会贯通。
1.1 txt文件
1.1.1 一维列表
1.1.1.1 保存txt文件
node = [1, 2, 3]
file = open('node.txt', 'a')
mid = str(node).replace('[', '').replace(']', '')
# 删除单引号并用字符空格代替逗号
mid = mid.replace("'", '').replace(',', '') + '\n'
file.write(mid)
file.close()
生成文件内容效果如下:
1.1.1.2 读取txt文件
使用numpy读取:
import numpy as np
node_pair1 = np.loadtxt('./node.txt', dtype=bytes).astype(int)
node_pair = list(node_pair1)
print(node_pair)
不使用numpy读取:
node_pair = []
with open('./node_pair.txt', 'r', encoding='utf-8') as f:
data = f.readlines()
for line in data:
# 将字符串以空格和'\n'分割,然后转换为int类型的数组赋值给elem
elem = list(map(int, line.split()))
node_pair.append(elem)
f.close()
print(node_pair)
输出结果如下:
1.1.2 二维列表
1.1.2.1 保存txt文件
node_pair = [[1, 2], [2, 3]]
file = open('node_pair.txt', 'a')
for i in range(len(node_pair)):
# 去除[]
mid = str(node_pair[i]).replace('[', '').replace(']', '')
# 删除单引号并用字符空格代替逗号
mid = mid.replace("'", '').replace(',', '') + '\n'
file.write(mid)
file.close()
生成文件内容效果如下:
1.1.2.2 读取txt文件
使用numpy读取:
import numpy as np
node_pair1 = np.loadtxt('./node_pair.txt', dtype=bytes).astype(int)
node_pair = []
for item in node_pair1:
node_pair.append(list(item))
print(node_pair)
不使用numpy读取:
node_pair = []
with open('./node_pair.txt', 'r', encoding='utf-8') as f:
data = f.readlines()
for line in data:
# 将字符串以空格和'\n'分割,然后转换为int类型的数组赋值给elem
elem = list(map(int, line.split()))
node_pair.append(elem)
f.close()
print(node_pair)
输出结果如下:
1.2 csv文件(不借助pandas)
1.2.1 一维列表保存
import codecs
import csv
node = [1, 2, 3]
file_csv = codecs.open('node_csv.csv', 'w+', 'utf-8')
mid = csv.writer(file_csv, delimiter=' ', quotechar=' ', quoting=csv.QUOTE_MINIMAL)
mid.writerow(node)
生成文件内容效果如下:
1.2.2 二维列表保存
import codecs
import csv
node_pair = [[1, 2], [2, 3]]
file = open('node_pair_csv.csv', 'a')
file_csv = codecs.open('node_pair_csv.csv', 'w+', 'utf-8')
mid = csv.writer(file_csv, delimiter=' ', quotechar=' ', quoting=csv.QUOTE_MINIMAL)
for i in node_pair:
mid.writerow(i)
生成文件内容效果如下:
1.3 csv文件(借助pandas)
实现列表保存到csv文件还可以借助pandas,下面对其进行说明。
1.3.1 一维列表
1.3.1.1 保存csv文件
import codecs
import csv
node = [1, 2, 3]
mid = pd.DataFrame(node)
mid.to_csv('./node_csv.csv', header=False, index=False)
生成文件内容效果如下:
此时保存的数据不再是成一行,而是成为了一列,如果想要变为一行来保存,可以在列表外再套一层列表即可。
import codecs
import csv
node = [[1, 2, 3]]
mid = pd.DataFrame(node)
mid.to_csv('./node_csv.csv', header=False, index=False)
生成文件内容效果如下:
1.3.1.2 读取csv文件
import pandas as pd
mid = list(pd.read_csv('./node_csv.csv'))
mid1 = []
for item in mid:
mid1.append(int(item))
print(mid1)
因为上面直接使用list()转换后,mid内的列表元素变为了字符类型,故新建mid1重新赋值为int类型。输出如下:
1.3.2 二维列表
1.3.2.1 保存csv文件
import codecs
import csv
node_pair = [[1, 3], [2, 3]]
mid = pd.DataFrame(node_pair)
mid.to_csv('./node_pair_csv.csv', header=False, index=False)
生成文件内容效果如下:
1.3.2.2 读取csv文件
import numpy
mid = np.loadtxt('./node_pair_csv.csv', delimiter=',', dtype=int)
node_pair = []
for item in mid:
node_pair.append(list(item))
print(node_pair)
生成文件内容效果如下:
1.4 xls/xlsx文件
1.4.1 一维列表
1.4.1.1 保存xls/xlsx文件
import pandas as pd
node = [1, 2, 3]
mid = pd.DataFrame(node)
mid.to_excel(r'node_xlsx.xlsx', header=False, index=False)
生成文件内容效果如下:
同1.3.1一样如果需要将数据都记录在第一行时,只需要在列表外部再套一层列表。
1.4.1.2 读取xls/xlsx文件
读取xls/xlsx文件,这里有一个需要注意的地方,有些人直接使用下面的语句打开xlsx文件会报错,打开xls文件就没问题,这主要是由于xlrd模块版本更新的问题,将版本退回到1.2.0即可正常运行。还有其他解决办法,请单击此处跳转:
import pandas as pd
mid = list(pd.read_excel('./node_xlsx.xlsx', header=None))
print(mid)
输出如下:
1.4.2 二维列表
1.4.2.1 保存xls/xlsx文件
import pandas as pd
node_pair = [[1, 3], [2, 3]]
mid = pd.DataFrame(node_pair)
mid.to_excel(r'node_pair_xlsx.xlsx', header=False, index=False)
生成文件内容效果如下:
1.4.2.2 读取xls/xlsx文件
import xlrd
data = xlrd.open_workbook(r'./node_pair_xlsx.xlsx') # 获取文本对象
table = data.sheets()[0] # 根据index获取某个sheet
rows = table.nrows # 获取当前sheet页面的总行数,把每一行数据作为list放到 list
result = []
for i in range(rows):
col = table.row_values(i) # 获取每一行数据
mid = []
for item in col:
mid.append(int(item))
result.append(mid)
print(result)
生成文件内容效果如下:
1.5 npy文件
.npy文件是numpy专用的二进制文件
1.5.1 一维列表
import numpy as np
node = [1, 2, 3]
np.save('node.npy', node_pair) # 保存文件
a = np.load('node.npy', allow_pickle=True) # 读取文件
node = []
for item in a: # 将ndarray转换为原字典类型
node.append(item)
print(node)
生成文件无法直接打开,这里与加载一起写在代码里了,输出效果如下:
1.5.2 二维列表
import numpy as np
node_pair = [[1, 3], [2, 3]]
np.save('node_dict.npy', node_pair) # 保存文件
mid = np.load('node_dict.npy', allow_pickle=True) # 读取文件
node_pair = []
for item in mid: # 将ndarray转换为原字典类型
node_pair.append(list(item))
print(node_pair)
生成文件无法直接打开,这里与加载一起写在代码里了,输出效果如下:
2. 字典
2.1 保存到txt文件
node_dict = {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
mid = str(node_dict)
f = open('node_dict.txt', 'w')
f.writelines(mid)
f.close()
生成文件内容效果如下:
2.2 csv文件
字典类型数据保存到csv文件需要先转换为DataFrame类型,转换完成后再使用to_csv()函数进行保存。
2.2.1 不带表头
2.2.1.1 保存csv文件
import pandas as pd
node_dict = {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
mid = pd.DataFrame(list(node_dict.items()))
# 保存csv
mid.to_csv('./node_dict.csv', header=False, index=False)
生成文件内容效果如下:
2.2.1.2 读取csv文件
import pandas as pd
mid = pd.read_csv('./node_dict.csv', header=None)
print(mid)
mid = mid.set_index(0)[1].to_dict() # 转换为原字典类型
print(mid)
输出读入的不带表头的csv文件:
2.2.2 带表头
2.2.2.1 保存csv文件
import pandas as pd
node_dict = {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
mid = pd.DataFrame(list(node_dict.items()))
mid.to_csv('./node_dict_title.csv', header=['h1', 'h2'], index=False)
生成文件内容效果如下:
2.2.2.2 读取csv文件
import pandas as pd
mid = pd.read_csv('./node_dict_title.csv')
print(mid)
mid = mid.set_index('h1')['h2'].to_dict() # 转换为原字典类型
print(mid)
输出读入的带表头的csv文件及转换后的源字典:
2.3 保存与读取xls/xlsx文件
import pandas as pd
node_dict = {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
mid = pd.DataFrame(list(node_dict.items()))
mid.to_excel('./node_dict.xls', header=False, index=False)
生成文件内容效果如下:
读取xls/xlsx文件的操作与读取csv文件的操作基本没有差别,只需要将pd.read_csv()函数变为pd.read_excel()即可。
2.4 保存与读取npy文件
import numpy as np
node_dict = {'a': [1, 2],'b': [2, 3]}
np.save('node_dict.npy', node_dict) # 保存文件
a = np.load('node_dict.npy', allow_pickle=True).item() # 读取文件
print(a)
生成文件无法直接打开,这里与加载一起写在代码里了,输出效果如下: