博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python自动化开发学习2-2
阅读量:5869 次
发布时间:2019-06-19

本文共 4358 字,大约阅读时间需要 14 分钟。

集合

创建集合可以用set(),或者直接用{}

1
2
3
4
5
set_a 
= 
set
([
1
,
2
,
3
,
4
,
5
])
set_b 
= 
{
1
,
3
,
5
,
7
,
9
}
print
(set_a)
print
(set_b)
print
(
type
(set_a),
type
(set_b))

集合同样也有各种操作,就记几个符号的。别的到用的时候再去查吧

1
2
3
4
5
6
7
set_a 
= 
set
([
1
,
2
,
3
,
4
,
5
])
set_b 
= 
{
1
,
3
,
5
,
7
,
9
}
print
(set_a | set_b)  
# 并集
print
(set_a & set_b)  
# 交集
print
(set_a ^ set_b)  
# 对称差集
print
(set_a 
- 
set_b)  
# 差集
print
(set_b 
- 
set_a)  
# 还是差集

并没有"+"号,并集已经有"|"号可以获得了。

集合删除的3中方法:

1
2
3
4
5
6
7
8
9
10
11
set_a 
= 
set
([
1
,
2
,
3
,
4
,
5
])
set_b 
= 
{
1
,
3
,
5
,
7
,
9
}
= 
set_a.pop()  
# 随机删除一个,返回值为删除的元素
print
(c,set_a)
set_b.remove(
3
)  
# 指定删除一个元素
print
(set_b)
set_b.discard(
7
)  
# 也是指定删除一个元素
print
(set_b)
set_b.discard(
2
)  
# discard允许尝试删除不存在的元素,但是remove会报错
#setb.discard(2)
print
(set_b)

文件的操作

open()打开文件。windows系统默认的是gbk编码,如果不指定字符编码,就会使用系统默认的字符编码打开文件。比如这时python就会使用gbk编码去读utf-8文件,运行后会报错或者读到乱码。

现在推荐我们的方法是全部文件都使用utf-8的编码格式。open的时候就不要省略这个参数了,直接指定utf-8的字符编码。

文件的基本操作:

1
2
3
4
file 
= 
open
(
'test.txt'
,encoding
=
'utf-8'
)  
# 打开文件,这里指定了utf-8
data 
= 
file
.read()  
# 读取文件的全部内容
print
(data)  
# 打印读取的内容
file
.close()  
# 关闭文件

读取文件内容逐行打印:

1
2
3
4
file 
= 
open
(
'test.txt'
,encoding
=
'utf-8'
)  
# 打开文件,这里指定了utf-8
for 
line 
in 
file
:
    
print
(line.rstrip())  
# 加了rstrip可以去掉每一行右边的空格(包括换行符)
file
.close()

推荐上面的方法实现。这个方法是一次读一行,让后操作,然后再处理下一行。这是一个高效的方法

如果是使用一次读取整个文件到内存,然后再进行处理的实现方法(比如readlines()),在处理大文件的时候效率会低很多。虽然那也得文件足够大(大到现在内存容量的级别几个G)。

不过这个方法处理的时候数据就不是列表了,要获取行号,只能在for循环开始的时候加一个计数器,然后每一次都自增1,这样来记录行号

1
2
3
4
5
6
file 
= 
open
(
'test.txt'
,encoding
=
'utf-8'
)  
# 打开文件,这里指定了utf-8
count 
= 
0
for 
line 
in 
file
:
    
count 
+
= 
1
    
print
(count,line.rstrip())  
# 加了rstrip可以去掉每一行右边的空格(包括换行符)
file
.close()

flush():强制刷新。默认写文件的时候,是先写入缓存,等缓存到一定数量后再一次全部写入硬盘。如果对数据的实时性要求高的话,又不想关闭文件的话,就需要这个方法来手动强制执行一次写如到硬盘的操作。

1
2
3
4
5
6
7
8
9
10
file 
= 
open
(
'test.txt'
,
'a'
,encoding
=
'utf-8'
)  
# 打开文件,追加模式
file
.write(
"先回将我存入缓存\n"
)
input
(
"去打开文件看看文件有没有更新"
)
file
.flush()
print
(
"现在再打开文件看看有没有更新"
)
input
(
"文件关闭前也会写入,我没再试一次"
)
file
.write(
"再来一次,先回将我存入缓存\n"
)
input
(
"打开文件看看文件有没有更新"
)
print
(
"现在再打开文件看看有没有更新"
)
file
.close()

验证了硬盘中的文件不是实时更新的。但是在flush()或者是close()之后,再去确认文件的时候都是最新的内容了。

文件的修改

文件的修改比较麻烦,没有办法做直接的修改。想要实现,只能重新全部写一遍。

方法一:一次读取文件的全部内容,然后修改后,再写回去。不适合大文件

1
2
3
4
5
6
7
8
9
10
file 
= 
open
(
'test.txt'
,encoding
=
'utf-8'
)
lines 
= 
file
.readlines()  
# 读取源文件
file
.close()
file_w 
= 
open
(
'test2.txt'
,
'w'
,encoding
=
'utf-8'
)  
# 重新打开一个文件,这里方便比较,使用了新的文件名
#file_w = open('test.txt','w',encoding='utf-8')  # 使用原来的文件名直接打开写入就实现了文件的修改
for 
count,line_w 
in 
enumerate
(lines):
    
if 
count
+
1 
=
= 
3
:
        
line_w 
= 
"这是被替换的第三行\n"  
# 这里修改替换掉第三行的内容,别忘了\n换行
    
file_w.write(line_w)  
# 将内容朱行写入到新文件
file_w.close()

方法二:也可以采取读一行,写一行的方式。避免一次读取过多的内容,更适合使用在大文件的场景。推荐:

1
2
3
4
5
6
7
8
9
10
file 
= 
open
(
'test.txt'
,encoding
=
'utf-8'
)  
# 打开源文件
file_w 
= 
open
(
'test2.txt'
,
'w'
,encoding
=
'utf-8'
)  
# 新建一个临时的新文件
count 
= 
0  
# 这种情况只能用计数器来计算行数了
for 
line 
in 
file
:
    
count 
+
= 
1
    
if 
count 
=
= 
3
:
        
line 
= 
'这是被替换的第三行\n'  
# 这里修改替换掉第三行的内容,别忘了\n换行
    
file_w.write(line)  
# 将内容朱行写入到新文件
file
.close()
file_w.close()

并没有完成文件的修改,到此只是将源文件修改后生成了一个新文件。还需要将源文件删除,然后将新文件改名。对文件的操作(非文件内容),还需要调用os模块,不过并不难。而且也不是这节课的重点,就略过了。

文件关闭的问题

文件用完后,可以用close()将文件关闭,释放文件句柄。如果不关,问题也不大(不过肯定不是好习惯)。另外,程序运行完之后,所有打开的文件都会被关闭。

总之,打开文件,如果不操作了,就应该关闭它。

使用with来了打开文件,可以自动关闭文件(通过缩进,在代码块执行完毕后,自动关闭文件)。所以条件允许的情况下,尽量用with来打开文件。将上面2段用with来改写一下

1
2
3
4
5
6
7
8
# 注意一下缩进,通过这个判断文件是否操作完毕,从而自动关闭
with 
open
(
'test.txt'
,encoding
=
'utf-8'
) as 
file
:
    
lines 
= 
file
.readlines()  
# 读取源文件
with 
open
(
'test.txt'
,
'w'
,encoding
=
'utf-8'
) as file_w:
    
for 
count,line_w 
in 
enumerate
(lines):
        
if 
count
+
1 
=
= 
3
:
            
line_w 
= 
"这是被替换的第三行\n"  
# 这里修改替换掉第三行的内容,别忘了\n换行
        
file_w.write(line_w)  
# 将内容朱行写入到新文件
1
2
3
4
5
6
7
8
9
10
11
# 可以同时对多个文件的上下文进行管理
# 另外,一行代码不建议超过80个字符,这里超了,所以用了\来分行
# 并且换行后可以对齐open,清晰的显示了打开的文件数量
with 
open
(
'test.txt'
,encoding
=
'utf-8'
) as 
file
,\
     
open
(
'test2.txt'
,
'w'
,encoding
=
'utf-8'
) as file_w:
    
count 
= 
0  
# 这种情况只能用计数器来计算行数了
    
for 
line 
in 
file
:
        
count 
+
= 
1
        
if 
count 
=
= 
3
:
            
line 
= 
'这是被替换的第三行\n'  
# 这里修改替换掉第三行的内容,别忘了\n换行
        
file_w.write(line)  
# 将内容朱行写入到新文件

作业

购物车程序:

1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表

2、允许用户根据商品编号购买商品

3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒

4、可随时退出,退出时,打印已购买商品和余额

5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示

6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买

7、允许查询之前的消费记录

上面是买家的模块,另外再做一个卖家的模块。账号登录后可以维护商品列表,新增、修改商品和价格。

本文转自骑士救兵51CTO博客,原文链接:http://blog.51cto.com/steed/1978845,如需转载请自行联系原作者
你可能感兴趣的文章
Web.xml详解(转)
查看>>
敏感性、特异性、假阳性、假阴性(sensitivity and specificity)
查看>>
软件开发工程师--经验之谈
查看>>
C#datagridView中嵌套控件
查看>>
java开发_mysql中获取数据库表描述_源码下载
查看>>
C#编写WINNT服务,随便解决安卓开发遇到的5037被众多程序无节操占用的问题
查看>>
position属性absolute(绝对定位),relatve(相对定位)
查看>>
HttpClient连接池的连接保持、超时和失效机制
查看>>
实现基于最近邻内插和双线性内插的图像缩放C++实现
查看>>
爪哇国新游记之二十六----迷宫寻路
查看>>
linux下vtune使用
查看>>
java学习5-jar包的下载以及导入
查看>>
android 判断service是否开启
查看>>
带你走进EJB--MDB
查看>>
【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其三)
查看>>
模拟服务器MockServer之Moco详细介绍
查看>>
架构师Jack专访:全面认识软件测试架构师
查看>>
最受白领欢迎的12大办公软件
查看>>
开发一个Linux调试器(八):堆栈展开
查看>>
腾讯云自曝自家技术只值1分钱,这技术以后谁还敢用
查看>>