Python 学习笔记 - 集合和文件操作-阿里云开发者社区

开发者社区> 余二五> 正文

Python 学习笔记 - 集合和文件操作

简介:
+关注继续查看

Set 集合


Set是一个无序而且不重复的元素集合。下面看看他有哪些基本功能


创建集合

1
2
3
4
5
6
>>> s1 = {11,22}
s2 = set()
s3 = set([11,22,33,4])
print(s1,s2,s3)
-------------------
{1122set() {3311422}


把列表转换成集合,注意列表中重复的元素只保留一次

1
2
3
4
5
>>> li = [11,22,11,22]
s1 = set(li)
print(s1)
---------------
{1122}


add给集合添加元素,clear清除集合的内容

1
2
3
4
5
6
7
8
9
10
11
12
>>> s = set()
print(s)
s.add(123)
s.add(123)
s.add(123)
print(s)
s.clear()
print(s)
---------------
set()
{123}
set()


两个集合A和B可以通过difference进行比较, 他会输出A中存在,而B中不存在的元素


1
2
3
4
5
6
7
8
9
10
>>> s1 = {11,22,33}
s2 = {22,33,44}
s3 = s1.difference(s2)
print(s3)
# A中存在,B中不存在
s3 = s2.difference(s1)
print(s3)
--------------
{11}
{44}


symmetric_difference 可以输出两个集合中都不相同的元素

1
2
3
4
5
6
7
8
>>> s3 = s1.symmetric_difference(s2)
print(s1)
print(s2)
print(s3)
--------------
{331122}
{334422}
{1144}


如果后面跟了update,那么他的作用是直接替换到A的结果中,比如A中存在,B中不存在的结果是11,difference_update直接替换了A的内容;类似的如果我再执行symmetric_difference_update,他把A和B都不相同的内容保存在A中。


1
2
3
4
5
6
7
>>> s1.difference_update(s2)
print(s1)
s1.symmetric_difference_update(s2)
print(s1)
------------
{11}
{33114422}


删除某一个元素可以用discard 或者 remove,但是如果该元素不存在,使用discard不会报错;而remove会抛出异常


1
2
3
4
5
>>> s1 = {11,22,33,1111}
s1.discard(1111)
print(s1)
----------
{331122}


不报错

1
2
>>> s1 = {11,22,33,}
s1.discard(1111)


抛出异常

1
2
3
4
5
6
7
>>> s1 = {11,22,33,}
# s1.discard(1111)
s1.remove(11111)
--------------------
Traceback (most recent call last):
  File "<input>", line 3in <module>
KeyError: 11111


如果随机的删除一个元素,可以使用pop

1
2
3
4
5
6
>>> ret = s1.pop()##随机删
print(s1)
print(ret)
-------------
{1122}
33


求交集(Intersection)和并集(Union)

1
2
3
4
5
6
7
8
9
10
>>> s1 = {11,22,33}
s2 = {22,33,44}
s3 = s1.union(s2)
print(s3)
s3 = s1.intersection(s2)
s1.intersection_update(s2)
print(s3)
-----------------
{33221144}
{3322}


update可以把其他的列表,元祖或者字符串的元素都并集进来,当然重复的不会添加

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> s1 = {11,22,33}
s1.add(11)
s1.add(12)
s1.add(13)
li = [11,22,3,11,2]
tup= (11,22,3,11,2)
st = "alexalex"
s1.update(li)
s1.update(tup)
s1.update(st)
print(s1)
-----------------------
{3323'l''a'11121322'x''e'}


小练习:两个字典,请判断出哪些key进行了变化,添加,删除和没变?


思路:把key单独转换成集合,然后通过判断集合元素是否存在判断添加和删除;通过交集判断哪些仍然存在为改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> old_dict = {
    "#1"8,
    "#2"4,
    "#4"2,
}
new_dict = {
    "#1"4,
    "#2"4,
    "#3"2,
}
new_set = set(new_dict.keys())
old_set = set(old_dict.keys())
remove_set = old_set.difference(new_set)
add_set = new_set.difference(old_set)
update_set = old_set.intersection(new_set)
print(remove_set,add_set,update_set)
----------------------
{'#4'} {'#3'} {'#2''#1'}


文件的操作


打开文件的模式

  • r ,只读模式【默认】

  • w,只写模式【不可读;不存在则创建;存在则清空内容;】

  • x, 只写模式【不可读;不存在则创建,存在则报错】

  • a, 追加模式【可读;   不存在则创建;存在则只追加内容;】


"+" 表示可以同时读写某个文件

  • r+, 读写【可读,可写】最常用

  • w+,写读【可读,可写】清空之后再写,然后可以读之后写入的内容

  • x+ ,写读【可读,可写】

  • a+, 写读【可读,可写】只能在末尾更改,无法灵活指定位置

 "b"表示以字节的方式操作

  • rb  或 r+b

  • wb 或 w+b

  • xb 或 w+b

  • ab 或 a+b


文件相关的函数

  • fread()  无参数,读取全部;有参数,有b,按照字节读;有参数,无b,按照字符读

  • tell(), 获取当前位置(字节)

  • seek(), 调到指定的位置(字节)

  • write(), 写入数据, 有b,按照字节;无b,按照字符写入

  • close(),  关闭文件

  • fileno(),文件描述符,判断文件是否有变化

  • flush(), 强制刷新到内容

  • readable(),判断是否可读

  • readline(),按行读

  • truncate(),截断,清空指针后面的内容

  • for 循环

  • with自动关闭文件



下面看看具体的例子


以只读方式打开一个文件db,注意编码我指定为utf-8,在utf-8里面 一个汉字等于3个字节;而在gbk里面,一个汉字占据2个字节。

1
2
3
4
5
6
7
8
>>> f=open('db','r',encoding="utf-8")
data=f.read()
print(data,type(data))
f.close()
------------------
sdf
aa
dddd <class 'str'>


我用只读字节的方式打开文件

1
2
3
4
>>> f=open('db','rb')
data=f.read()
print(data,type(data))
b'sdf\r\naa\r\ndddd' <class 'bytes'>


下面的操作会抛出异常,因为我用字节的方式打开文件,当我尝试用字符串写入的时候,格式不兼容

1
2
3
4
5
6
7
>>> f=open("db",'ab')
f.write("hello")
f.close()
---------------
Traceback (most recent call last):
  File "<input>", line 2in <module>
TypeError: a bytes-like object is required, not 'str'


字节的方式添加信息

1
2
3
>>> f=open("db",'ab')
f.write(bytes("哈",encoding="utf-8"))
f.close()

结果如下

1
2
3
sdf
aa
dddd哈


以读写方式打开文件,指定只读取前2个字符,注意这里没有指定b,因此是按字符读取;否则按照字节读取;tell()可以获取当前指针的位置(字节)

1
2
3
4
5
6
>>> f=open("db",'r+',encoding="utf-8")
data=f.read(2)
print(data)
print(f.tell())#获取当前指针位置(字节)
sd
2


首先读取一个包含汉字的文件,如下所示,我指定了编码是utf-8,也指定了b,因此他是按照字符读取;这里他读取前2个字符“幸福”,然后因为utf-8一个汉字字符是3个字节,因此他的位置是6个字节处

1
2
3
4
5
6
7
>>> f=open("db",'r+',encoding="utf-8")
data=f.read(2)
print(data)
print(f.tell())
--------------
幸福
6


如果这个时候我对这个文件做个修改,seek指定位置为第一个字节处,然后向后覆盖7777,这个时候他会把汉字(3个字节)硬拆开,导致的结果就是乱码

1
2
3
4
>>> f.seek(1)
#当前指针位置开始向后面覆盖
f.write("7777")
f.close()

结果如下所示

1
2
3
7777sdf
aa
dddd哈


flush函数强行把内存的数据写入硬盘保存,尽管还没有close

1
2
3
4
 >>> f=open('db','a')
 f.write('123')
 f.flush()  #没有close 但是内容写入了硬盘
 input("hhhh")


readable顾名思义,判断一个文件是否可读,这里我一个只写方式打开的文件返回False

1
2
3
4
>>> f=open('db','w')
print(f.readable())
---------
False


read()是读取全部,read(x)是读取前x个字节或者字符,而 readline()是读取一行,注意指针位置变化

1
2
3
f=open('db','r')
f.readline()#注意指针的变化
f.readline()


truncate截断,指针后面的内容清空

1
2
3
>>> f=open('db','r+',encoding='utf-8')
f.seek(3)
f.truncate()

结果如下

1
sds


一个很常见的方式是通过for循环来读取每一行的内容,如下所示

1
2
3
4
5
6
7
8
>>> f=open('db','r+',encoding='utf-8')
for line in f:
    print(line)
-------------
sds
2
234
232sd


with自动关闭文件,这样不需要手动的使用 f.close()了

1
2
with open('db') as f:
    pass


Python2.7以后,可以同时操作两个文件,比如说,只读方式打开文件1,拷贝前10行文件到文件2里面

1
2
3
4
5
6
7
8
with open('db1','r',encoding="utf-8") as f1,open('db2','w',encoding='utf-8') as f2:
    times=0
    for line in f1:
        times+=1
        if times <=10:
            f2.write(line)
        else:
            break





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1840946,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PHP操作XML文件学习笔记
原文:PHP操作XML文件学习笔记   XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据。   对于XML的操作包括遍历,生成,修改,删除等其他类似的操作。PHP对于XML的操作方式很多,这次学习的是通过DOMDocument进行操作,其他的操作方法可以参考   http://www.oschina.net/code/snippet_110138_4727   1.对XML文件的遍历     通过DOMDocument对于XML文件的操作的方法:首先要实例化一个DOMDocument类的对象,然后引入要操作的XML文件。
812 0
《Servlet和JSP学习指南》一导读
自从Servlet面世以来,也开发出了许多基于Java的Web框架,以帮助程序员更迅速地编写Web应用程序。
1134 0
Java多线程高并发学习笔记(一)——Thread&Runnable
进程与线程 首先来看百度百科关于进程的介绍: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
980 0
Python零基础学习笔记(六)—— 变量和常量
变量: 程序可操作的存储空间的名称 程序运行期间可改变的数据 每个变量都有特定的类型 作用:将不同类型的数据存储到内存 定义变量:变量名 = 初始值(为了确定变量的类型,python里面可以直接识别数据类型 例如:age = 10) 数据的存储:变量名 = 数据值 特别注意:变...
1387 0
Python零基础学习笔记(三)——注释、输入和输出
单行注释# """多行注释多行注释......""" '''多行注释多行注释......'''print 打印到屏幕上一些信息,内容就是“”之间的print("这是第一个关于注释的文件") 2 .打印多个字符转,用逗号隔开,但遇到逗号会输出一个空格print("我","是","谁") 可以运算pr...
1472 0
The Road to learn React书籍学习笔记(第二章)
The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存、修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状态。
899 0
The Road to learn React书籍学习笔记(第一章)
react灵活的生态圈 Small Application Boilerplate: create-react-app Utility: JavaScript ES6 and beyond Styling: plain CSS and inline style Asynchronous Re...
1013 0
Django学习笔记----数据库操作实例
上上篇>Django学习笔记----环境搭建基于Windows 上一篇>Django学习笔记----快速入门 修改settings.py配置 在环境搭建篇, 我们已经安装了mysql-client包 安装好后, 在settings.
1196 0
+关注
20382
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载