python基础(四)文件操做和集合

一.文件操做python

对文件的操做分三步:windows

        一、打开文件获取文件的句柄,句柄就理解为这个文件ruby

        二、经过文件句柄操做文件bash

        三、关闭文件。测试

1.文件基本操做:ui

  • f = open('file.txt','r') #以只读方式打开一个文件,获取文件句柄,若是是读的话,r能够不写,默认就是只读,
  • 在python2中还有file方法能够打开文件,python3中file方法已经没有了,只有open        
  • frist_line = f.readline()#获取文件的第一行内容,返回的是一个list
  • print(frist_line)#打印第一行
  • res = f.read()#获取除了第一行剩下的全部文件内容,文件句柄发生了变化
  • print(res)
  • f.close()#关闭文件

2.文件打开模式:编码

r:只读,不加模式默认为r
    w:只写,[不可读,不存在则建立,存在则删除内容]
    a:追加,[不可读,不存在则建立,存在则只追加内容] "+" 表示能够同时读写某个文件 r+ :读写--可读、可写、可追加,若是打开的文件不存在的话,会报错 w+ :写读--先建立文件,再写(在原文件上的修改都是覆盖操做) a+ :追加读--默认打开句柄在末尾,读取需先seek(0)指定位置,一写句柄就到末尾了 #r和w,seek指定句柄能够覆盖修改,a+指定句柄也是追加 "U"表示在读取时,能够将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) rU r+U # windows上换行符为 \r\n "b"表示处理二进制文件 rb:二进制文件读 wb:二进制文件写 ab:追加二进制 # 文件存在硬盘上都是二进制,前边说encoding='utf-8'是指把二进制转换成utf-8编码打开, # 而“b”是指,不用转换编码,我直接读取二进制

3.文件操做:spa

f = open("1.txt", 'r', encoding="utf-8") # encoding="utf-8",utf-8编码打开文件,windows下默认gbk打开 f.readline() # 读一行,字符串 f.readable() # 判断文件是否可读
f.writable() # 判断文件是否可写
f.encoding() # 打印文件的编码
f.read() # 读取文件句柄到结束全部内容,大文件时不要用,由于会把文件内容都读到内存中
f.readlines() # 读取文件全部内容,返回一个list,元素是每行的数据,大文件时不要用 f.write("天安门") # 写入内容,r和w模式,为句柄处覆盖写入,a模式写到最后
f.writelines(['zhangsan'],['李四']) #将一个列表写入文件中 f.flush() # 强制刷新(默认缓冲区满了存入磁盘) f.close() # 文件关闭 f.closed() # 判断文件是否关闭 f.read(5) # 读取5个字符 f.tell() # 查看文件句柄位置。按照字符计数 f.seek(0) # 移动文件句柄到第0个字符位置 f.encoding # 文件编码 f.truncate() # 什么不写清空文件 f.truncate(10) # r模式截断出前10个字符,其余模式仍是清空

大文件时,读取文件高效的操做方法:
用上面的read()和readlines()方法操做文件的话,会先把文件全部内容读到内存中,这样的话,内存数据一多,很是卡,高效的操做,就是读一行操做一行,读过的内容就从内存中释放了

f = open('file.txt')
for line in f: # f 变成了迭代器
  print(line) # 判断行的话,需本身加个计数器

4.文件内容修改 
前面说的文件修改,只是对原内容覆盖,并不会插入内容,原内容日后移,由于这样有可能就把其余文件覆盖了,文件发生损坏。so: 
文件修改两个办法: 
  1. 加载到内存,内存修改,覆盖写回 
  2. 另打开一个文件,修改完写到新文件中.net

with open("test", 'r+', encoding='utf-8') as fr res = fr.read()
  new_res = res.replace('我','me')
  fr.write(new_res)
with open("test", 'r', encoding='utf-8') as f, \ open("test.tmp", 'w', encoding='utf-8') as f_new: for line in f: if "聚焦头条" in line: line = line.replace("聚焦头条","fgf") f_new.write(line) # os.path.exists("test.bak") 判断文件是否存在 # os.remove("test.bak") 删除文件 # os.rename(test.tmp, test) 重命名

5.文件关闭(with语句) 
为了不打开文件后忘记关闭,能够经过管理上下文,即:code

with open('log') as f: pass

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。 
Python 2.7 后,with又支持同时对多个文件的上下文进行管理

 

二.集合

集合也是一种数据类型,一个相似列表的东西,特色是一个无序的,不重复的数据组合,它的主要做用以下:

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据以前的交集、差集、并集等关系

一、经常使用操做

去重
    list_1 = [1,1,2,3,4,5,6,6,7,7,8,8,9,9,3] set_1 = set(list_1) >>> set_1 {1, 2, 3, 4, 5, 6, 7, 8, 9} # 集合用{}表示 交集 set_2 ={0,2,3,4} set_1.intersection(set_2)
  set_1&set_2 并集: set_1.union(set_2)
  set_1 | set_2 差集: set_1.difference(set_2)
  set_1 - set_2 # in set_1 but not in set_2 子集: set_1.issubset(set_2) #判断set_1是否是set_2的子集 父集: set_1.issuperset(set_2) #判断
set_1是否是set_2的父集
对称差集:(并集去除交集,即并集和交集的差集) 输出2个列表都没有的值
  set_1.symmetric_difference(set_2) 即(set_1 | set_2) - (set_1 & set_2)
set_1 ^ set_2
判断有没有交集,无交集,返回True
  set_1.isdisjoint(set_2)

二、符号操做

& : 交集        intersection
    | :并集        union
    - :差集 difference s <= t :子集 issubset s >= t :父集 issuperset ^ :对称差集 symmetric_difference

三、集合增删改查

添加:
    set_1.add(99) 批量添加 set_1.update([1,2,3,4]) 删除: set_1.remove('h') # 没有则报错 set_1.discard(99) # 在则删除,不在就不操做。无返回信息 随机删: set_1.pop() 长度: len(set_1) 是否属于判断 s in set_1 # (判断成员在不在都是这么写,字典中判断key) 返回 set “s”的一个浅复制 s.copy() 
相关文章
相关标签/搜索