首页 > 技术文章 > python学习之路day4

gilgamesh-hjb 2017-07-20 21:06 原文

书中自有黄金屋,书中自有颜如玉


 

集合是一个无序的不重复的数据组合,它的主要作用如下:

去重:把一个列表变成集合,就自动去重

关系测试:测试两组数据之前的交集、差集、并集等关系

基本操作:

s = set([3,5,9,10]) #创建一个数值集合   自动去重了

t = set("Hello") #创建一个唯一字符的集合


a = t | s # t 和 s的并集 

b = t & s # t 和 s的交集  或者写成 b = t.intersection(s)

c = t s # 求差集(项在t中,但不在s中)  或者写成 c = t.difference(s)

d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)  并集减去交集

list1.issubset(list2)  #若list1是list2的子集,返回True

lsit2.issupperset(list1)  #若list2是list1的父集, 返回True


 

小知识点:

list_1.isdisjoint(list_2) #若list_1与list_2无交集,返回True





基本操作:

t.add('x') # 添加一项

s.update([10,37,42]) # 在s中添加多项 ( 注意update多项元素用中括号【】)



使用remove()可以删除一项:  如果()在集合里不存在,则报错;而discard()返回None

t.remove('H')


len(s)
set 的长度


不论字符串,字典,列表,集合等都是一下格式来进行判断
x in s
测试 x 是否是 s 的成员

x not in s
测试 x 是否不是 s 的成员



s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中

s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中

s.union(t)
s | t
返回一个新的 set 包含 s 和 t 中的每一个元素

s.intersection(t)
s & t
返回一个新的 set 包含 s 和 t 中的公共元素

s.difference(t)
s - t
返回一个新的 set 包含 s 中有但是 t 中没有的元素

s.symmetric_difference(t)
s ^ t
返回一个新的 set 包含 s 和 t 中不重复的元素

s.copy()
返回 set “s”的一个浅复制


 

文件操作

思想:打开>>操作>>关闭


 

小知识点:在windows下打开文件默认编码格式为GBK,而python默认编码为unicode(utf-8),因此在用open()打开文件时不输入encoding="utf-8"就会处理不了GBK格式文件

f=open('文件名',encoding='utf-8') # f就是文件内存对象(文件句柄)


文件的写入

f=open('文件名',encoding='utf-8') #f就是文件内存对象

PS:完整格式为

f=open('文件名','r',encoding='utf-8')  #  "r", "w", "a"   (read, write, append)

"w"为创建新的文件并将写入的内容覆盖掉原本的文件内容!也可以写入,格式:f.write("--------")

"a"为追加内容,写入的内容不覆盖原来的文件内容,写入格式:f.write("----------")


                                                                    文件的读取
data=f.read() #data已经“读完了”一遍文件,光标已经指向最末位
data2=f.read() #data2为空值,因为data已经“读完了”一遍文件,光标已经指向最末位,再次读取当然是空值了

 

print(f.tell())  #打印当前光标的位置,按读了的字符计数
f.seek(0) #光标又移动到0 ###seek()即为光标的跳转
print(f.readline()) #打印第一行

 

f.readline()仅仅是一行内容,f.readlines()则是把所有内容按行形成列表,形如['111111------------\n', '222222------------\n'],

f.readline()只适合读小文件,大文件要加载很长时间(整个文件全部放在内存里)

解决方法:内存中只保存一行数据,读一行删一行

low loop :

for index, line in enumerate(f.readlines()):
if index!= 9: #不打印第十行
print(line.strip()) #虽然去掉了换行(\n),但是是一句句打印的
也可这样写:
for index, line in enumerate(f.readlines()):
if index == 9:
print('------我是分割线-------')
continue
print(line.strip())

High bige:效率最高,内存中只保存一行数据

f=open('yesterday','r',encoding='utf-8')
for line in f: #这里的f不是列表,迭代替
print(line)

对第十行进行特别的操作:
f=open('yesterday','r',encoding='utf-8')
count=0
for line in f:
count +=1
if count == 10 :
print('------我是分割线------')
print(line.strip())

print(f.encoding)  #打印文件的编码(utf-8还是别的)

 

f.flush()  #把之前写入的数据(实际上存在缓存里)实时刷新写到硬盘里

进度条(伪?):结果是#一个个出现

 

import  sys, time
for i in range(20):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)

f.closed 判断是否关闭 返回True or False

 

f=open('yesterday2','a',encoding='utf-8')  #注意这里是'a',若为'w'肯定覆盖了原文件
#f.truncate() #不写就把文件yesterday2清空
f.truncate(10) #从头开始截断不论光标在什么位置

既能读又能写:
读写模式:“r+” 最常用
f=open('yesterday2','r+',encoding='utf-8')  #以读和追加(从最后开始追加)的模式打开,不论光标在什么位置
写读模式:“w+”
追加读写:“a+”

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

  • r+,可读写文件。【可读;可写;可追加】【只能在最后写入】
  • w+,写读  【覆盖掉】
  • a+,同a
  • rb,打开二进制文件(视频)
  • 同理有wb,ab
f.write("hello\n".encode()) #把字符串转换成二进制再进行写入

对文件进行修改
1.将文件加载到内存里,在内存里修改完后写回原文件;
(在硬盘里修改的话只能覆盖原文件的内容。)

2.打开文件,修改后存到新的文件
思路:同时打开两个文件,一个读,一个写
f = open("yesterday2",'r',encoding='utf-8')

f_new = open("yesterday2.new.",'w',encoding='utf-8')

for line in f :    #对每一行逐一查找并写入到f_new
if "肆意的快乐等我享受" in line :
line=line.replace("肆意的快乐等我享受","肆意的快乐等Alex享受")
                #old          new

f_new.write(line) # 写入 line 到 f_new这个文件对象
f.close()
f_new.close()

知识点:sys.argv[number]用于传递参数
Sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始
比如上例把old和new设成参数:
目前还不太清楚怎么弄QAQ
import sys
f = open("yesterday2",'r',encoding='utf-8')

f_new = open("yesterday2.new.",'w',encoding='utf-8')
find_str=sys.argv[1]
replace_str=sys.argv[2]

for line in f :    #对每一行逐一查找并写入到f_new
if find_str in line :
line=line.replace(find_str,replace_str)
                #old    new
f_new.write(line) # 写入 line 到 f_new这个文件对象
f.close()
f_new.close()


with 用法
用来自动关闭文件(防止你忘记关闭)

with open("yesterday2",'r',encoding='utf-8') as f:
-----------------------------------------------------
f = open("yesterday2",'r',encoding='utf-8')
-----------------------------------------------------
效果相同,但是with语句不用输入f.close(),并且with可以同时打开多个文件:
with open('log1') as obj1, open('log2') as obj2:


一点代码规范:代码的换行 ,\
with open("yesterday2",'r',encoding='utf-8') as f,\
open("yesterday2",'r',encoding='utf-8') as f2:

 



小知识:ascii码里只能存英文和特殊字符,一个英文只占一个字节,8位
unicode不论中英文还是什么文都是两个字节,16位
为了解决unicode占用空间过多的问题,出现了UTF-8(可伸缩的字符编码)(英文还是ascii码形式,中文字符统一三个字节)

1.在python2默认编码是ASCII, python3里默认是unicode


2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间


3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string


#-*-coding:gb2312 -*-   #这个也可以去掉
__author__ = 'Alex Li'

import sys
print(sys.getdefaultencoding())


msg = "我爱北京天安门"
#msg_gb2312 = msg.decode("utf-8").encode("gb2312")
msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔
gb2312_to_unicode = msg_gb2312.decode("gb2312")
gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")

print(msg)
print(msg_gb2312)
print(gb2312_to_unicode)
print(gb2312_to_utf8)
 

推荐阅读