Python文件读写 、 csv模块、pandas操作文件、json模块、xlrd模块--操作Excel
python文件读写:
读文件:
文件内容如右图:
file.read()方法返回的是整个文件的内容,type是str类型
file.readline()方法返回的是文件一行的内容(首行),type也是str类型
file.readlines()返回的是list类型, 并且文件的每一行是list中元素,每行最后都有一个'\n'换行符。list类型可遍历(Iterator)
逐行读取 for line in file: 返回的line是字符串类型,file 来自 with open(filename ) as file 这里的file
filename = 'C:\\users\\CaptainT\\Desktop\\word.txt'
with open(filename) as ff:
contents = ff.read()
# .rstrip() 删除字符串尾部的空白, 包括空格和换行,rstrip 是剥去,去除的意思
print(contents.rstrip())
输出如右图
注意:下面的形式与上面的写法等价。但是with open( )会在操作完成之后自动close文件,免得下面这种方式每次都是手动close。
filename = 'C:\\users\\CaptainT\\Desktop\\word.txt'
file = open(filename)
contents = file.read()
print(contents.rstrip())
file.close()
写文件:
file.write(str) 写一行。
file.writelines(list) 写多行,list中元素的需要时str,否则报错。并且每写一个元素需要换行的话,需要添加换行符。
ss = "I love python"
ask = 'And what about you?'
pardon = 'You must be also love Python.^_^'
filename = 'C:\\users\\CaptainT\\Desktop\\word.txt'
with open(filename, "w") as fo: # 'w'覆盖写
fo.write(ss + '\n')
with open(filename, "a") as fo: # 'a'追加写,只能写文件
fo.write(ask + '\n')
with open(filename, "a+") as fo: # 'a+'追加读写的方式打开文件,即这种方式也可以读文件
fo.write(pardon + '\n')
此时文件内容为:
CSV模块:
持续更新....
pandas文件操作:
read_csv: 从文件,URL,文件型对象中加载带分隔符的数据。默认分割符为逗号
read_table:从文件,URL,文件型对象中加载带分隔符的数据。默认分隔符为制表符("\t")
源文件由于该文件以逗号分隔,可以使用read_csv将其读入一个DataFrame:
import pandas as pd
df = pd.read_csv('C:\\Users\\CaptainT\\Desktop\\ex1.csv')
df
a | b | c | d | message | |
---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | hello |
1 | 5 | 6 | 7 | 8 | world |
2 | 9 | 10 | 11 | 12 | foo |
#也可以用read_table,但是需要制定分隔符为逗号
df2 = pd.read_table('C:\\Users\\CaptainT\\Desktop\\ex1.csv', sep=',') # 指定分隔符
df2
a | b | c | d | message | |
---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | hello |
1 | 5 | 6 | 7 | 8 | world |
2 | 9 | 10 | 11 | 12 | foo |
若文件没有标题行(表头),读入方法有两个:1)让pandas分配默认列名,2)自己定义列名。内容如图
pd.read_csv("C:\\Users\\CaptainT\\Desktop\\en4.csv", header=None)
0 | 1 | 2 | |
---|---|---|---|
0 | 1 | jin | yuz |
1 | 2 | meng | wei |
2 | 3 | dong | yanl |
3 | 4 | sun | lu |
4 | 5 | deng | xingw |
pd.read_csv("C:\\Users\\CaptainT\\Desktop\\en4.csv", names=['id', 'first_name', 'name'])
id | first_name | name | |
---|---|---|---|
0 | 1 | jin | yuz |
1 | 2 | meng | wei |
2 | 3 | dong | yanl |
3 | 4 | sun | lu |
4 | 5 | deng | xingw |
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
zip([iterable, ...]) # 一个或多个迭代器
([iterable, ...]) # 一个或多个迭代器
a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipped =zip(a,b) # 打包为元组的列表 ,zipped为可迭代的对象
print([_ for _ in zipped]) # [(1, 4), (2, 5), (3, 6)]
print(list(zip(a,b))) # [(1, 4), (2, 5), (3, 6)]
zip(a,c) # 元素个数与最短的列表一致
print([_ for _ in zip(a,c)]) # [(1, 4), (2, 5), (3, 6)]
print(list(zip(a,c))) # [(1, 4), (2, 5), (3, 6)]
ss1, ss2 = zip(*zip(a,b)) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
print(tuple(ss1)) # (1, 2, 3)
print(list(ss2)) # [4, 5, 6]
操作json文件 -- 注意中文的编码问题
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
JSON在python中分别由list和dict组成。
json 和 pickle -- 用于序列化的两个模块:
- json: 用于字符串和python数据类型间进行转换
- pickle: 用于python特有的类型和python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中 loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型
json是可以在不同语言之间交换数据的,而pickle只在python之间使用。json只能序列化最基本的数据类型,josn只能把常用的数据类型序列化(列表、字典、列表、字符串、数字、),比如日期格式、类对象!josn就不行了。而pickle可以序列化所有的数据类型,包括类,函数都可以序列化。
事例:
dumps:将python中的 字典 转换为 字符串
import json
test_dict = {'希尔排序': {'实体描述': 'null', '实体概念': [], '实体关系': []}}
print(test_dict)
print(type(test_dict))
# dumps 将数据转换成字符串
# 加上ensure_ascii=False是防止显示的不是中文,而是中文编码
json_str = json.dumps(test_dict, ensure_ascii=False)
print(json_str)
print(type(json_str))
返回结果如下:
{'希尔排序': {'实体描述': 'null', '实体概念': [], '实体关系': []}}
<class 'dict'>
{'希尔排序': {'实体描述': 'null', '实体概念': [], '实体关系': []}}
<class 'str'>
loads: 将 字符串 转换为 字典
new_dict = json.loads(json_str)
print(new_dict)
print(type(new_dict))
#返回结果如下:
# {'希尔排序': {'实体描述': 'null', '实体概念': [], '实体关系': []}}
# <class 'dict'>
dump: 将 python字典(dict)类型 写入json文件中
with open('E:\\EduKG\\test.json', 'w', encoding='UTF-8') as f:
json.dump(new_dict, f, ensure_ascii=False) # 同理,此处是避免编码问题
print('Writing done...')
结果如下:
load: 读取文件内容,并转换成 dict类型
with open('E:\\EduKG\\test.json', 'r', encoding='UTF-8') as f:
load_dict = json.load(f)
print(load_dict)
print(type(load_dict))
xlrd模块 -- python操作Excel
excel原内容:
import xlrd
import json
def handle():
data_dict = {}
file = 'E:\\课程知识图谱\\知识图谱测试题.xls'
data = xlrd.open_workbook(file) # 打开xls文件
table = data.sheets()[1] # 打开第二张表
rows = table.nrows # 获取表的行数
line = table.ncols # 获取表的列数 -- column
table_list = data.sheet_names() # 返回所有的sheet表单的名字, list形式
sheet2 = data.sheet_by_name('数据结构') # 此处的sheet2和上面第7行的table是同一个表单
sheet3 = data.sheet_by_index(1) # sheet2 sheet3 和 table 均是同一个表单
print(sheet2.row_values(0)) # 返回第一行的内容
print(sheet3.col_values(0)) # 返回第一列的内容
print(table_list)
print(line)
print(rows)
for i in range(rows):
mid = table.row_values(i)
for j in range(len(mid)):
mid[j] = mid[j].strip()
if mid[0] not in data_dict.keys():
data_dict[mid[0]] = [] # 字典的value是个list,下面往list里面添加内容用append
data_dict[mid[0]].append(mid[1:4])
else:
data_dict[mid[0]].append(mid[1:4])
# print('<br>'.join(mid[1:]))
# print(mid[1:4])
# for k, v in data_dict.items():
# print(k, v)
# print(len(data_dict))
with open('E:\\EduKG\\exercise.json', 'w', encoding='UTF-8') as f: # 写成json文件
json.dump(data_dict, f, ensure_ascii=False)
print('Write done...')
if __name__ == '__main__':
print('...')
handle()
持续更新...
智能推荐
spring cloud netflix (07) 服务的消费者(feign)
前言 完整知识点:spring cloud netflix 系列技术栈 Feign (同步通信 HTTP通信) feign是基于接口完成服务与服务之间的通信的 搭建Feign服务 项目结构 项目搭建 pom.xml application类 application.yml 使用feign完成服务与服务之间的通信 feign是基于接口完成服务与服务之间的通信的...
AtCoder Beginner Contest 174 E.Logs
AtCoder Beginner Contest 174 E.Logs 题目链接 到最后才发现是二分,菜菜的我/(ㄒoㄒ)/~~ 我们直接二分 [1,max{a[i]}][1,max\lbrace a[i]\rbrace][1,max{a[i]}] 即可,对每一个 midmidmid,每个数 a[i]a[i]a[i] 只需要切 a[i]−1mid\frac{a[i]-1}{mid}mi...
小程序基础与实战案例
小程序开发工具与基础 小程序开发准备: 申请小程序账号( appid ) 下载并安装微信开发者工具 具体步骤如下: 先进入 微信公众平台 ,下拉页面,把鼠标悬浮在小程序图标上 然后点击 小程序开发文档 照着里面给的步骤,就可以申请到小程序账号了。 然后就可以下载 开发者工具 了 下载完打开后的界面就是这个样子 下面让我们来新建一个小程序开发项目: 在AppID输入自己刚刚注册的AppID就可以,或...
VMware centOS7 下通过minikube部署Kubernetes
1、环境准备: VMware CentOS-7-x86_64 CPU:2*2core 内存:8G 宿主机和虚拟机需网络互通,虚拟机外网访问正常 Centos发行版版本查看:cat /etc/centos-release root用户操作 2、禁用swap分区 Kubernetes 1.8开始要求关闭系统的Swap,可暂时关闭或永久禁用, 使用 $ free -m 确认swap是否为开启状态 $ s...
逻辑回归与scikit-learn
欢迎关注本人的微信公众号AI_Engine LogisticRegression 算法原理 一句话概括:逻辑回归假设数据服从伯努利分布,通过极大化似然函数(损失函数)的方法,运用梯度下降或其他优化算法来求解参数,来达到将数据二分类的目的。 定义:逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性(不是概率)。比如某用户...
猜你喜欢
指针OR数组?用他们来表达字符串又有何不同?
cocowy的编程之旅 在学习C语言的过程中我们经常可以看到或者听到这样一句话:数组其实等价于指针,例如: 在这里可以轻松的看出输出后他们的值相等,其实在计算机内存里面,p为本地变量,有着他自己的作用域。而指针变量q保存着这个数组的首地址,通过*号指向这个地址保存的变量值。 然而我们再看一个例子: 这个时候计算机报错,这是为什么呢? 其实原因很简单,指针说指向的这个字符串的地址是位于计算机代码段地...
广度搜索
广度搜索的基本使用方法 广度搜索不同于深度搜索,是一种一步一步进行的过程,每一个点只记录一遍。需要用到队列记录每一步可以走到的位置,找到目标位置输出步数即可。 用到的知识:结构体、队列 如图 首先我们需要定义一个结构体来存储每个遍历到的点和步数 广搜不会用到递归,所以可以直接在主函数里写,这里需要定义一个结构体队列 初始化队列并将起始点入列 遍历 完整代码...
NIO Socket 编程实现tcp通信入门(二)
1、NIO简介 NIO面向通道和缓冲区进行工作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。可以双向传输数据,是同步非阻塞式IO。NIO还引入了选择器机制,从而实现了一个选择器监听多个底层通道,减少了线程并发数。用NIO实现socket的Tcp通信需要掌握下面三个知识点: Buffer 缓冲区 Channel 通道 Selector 选择器 2、java.nio.Buff...
[字节码系列]ObjectWeb ASM构建Method Monitor
在前面的篇章中,我们看到Java Instrutment的强大能力,本篇,我们将介绍如何使用ObjectWeb ASM的字节码增强能力构建Method Monitor 1.什么是ObjectWeb ASM ObjectWeb ...
Core Location 电子围栏:入门
原文:Geofencing with Core Location: Getting Started 作者:Andy Pereira 译者:kmyhy 更新说明:Andy Pereira 将本教程升级至 Xcode 9.3 和 Swift 4.1。 Geofencing 会在设备进入/离开指定的电子围栏时通知应用程序。它可以让你写出一些很酷的应用程序,当你从家里出来时触发通知,或者在附近出现最爱的商...