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

一.文件操作

对文件的操作分三步:

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

        2、通过文件句柄操作文件

        3、关闭文件。

1.文件基本操作:

  • 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.文件操作:

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. 另打开一个文件,修改完写到新文件中

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语句) 
为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open('log') as f:
    pass

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

 

二.集合

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

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

1、常用操作

去重
    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)

2、符号操作

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

3、集合增删改查

添加:
    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()  
 
 
posted @ 2016-12-19 17:24  Claire_test  阅读(825)  评论(0编辑  收藏  举报