python文件对象提供了三个“读”方法: read()、readline()readlines()。每种方法可以接受一个变量以限制每次读取的数据量。

  • read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
  • readlines() 一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。
  • readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。

注意:这三种方法是把每行末尾的'\n'也读进来了,它并不会默认的把'\n'去掉,需要我们手动去掉。


python文件对象提供了两个“写”方法: write() writelines()

  • write()方法和read()、readline()方法对应,是将字符串写入到文件中。
  • writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。

关于open()的mode参数

'r':读

'w':写

'a':追加

'r+' == r+w(可读可写,文件若不存在就报错(IOError))

'w+' == w+r(可读可写,文件若不存在就创建)

'a+' ==a+r(可追加可写,文件若不存在就创建)

对应的,如果是二进制文件,就都加一个b就好啦:

'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'


example:

    有两个文件,每个都有很多行ip地址,求出两个文件中相同的ip地址:

# coding:utf-8
import bisect

with open('test1.txt', 'r') as f1:# 'with'can close file automaticlly
    list1 = f1.readlines()
for i in range(0, len(list1)):
    list1[i] = list1[i].strip('\n')
with open('test2.txt', 'r') as f2:
    list2 = f2.readlines()
for i in range(0, len(list2)):
    list2[i] = list2[i].strip('\n')

list2.sort()
length_2 = len(list2)
same_data = []
for i in list1:
    pos = bisect.bisect_left(list2, i) #二分法
    if pos < len(list2) and list2[pos] == i:
        same_data.append(i)
same_data = list(set(same_data))#利用set的唯一性去除重复项
print(same_data)

bisect 针对有序 数组的插入和排序操作的一个模块。

其包含的方法:

     bisect    bisect_left     bisect_right     insort    insort_left     insort_right

     其中 bisect 就是调用的bisect_right  , insort 就是调用 的insort_right

bisect_left(a, x, lo=0, hi=None)

——其目的在于查找该数值将会插入的位置并返回,而不会插入。如果 x 存在于a中则返回x左边的位置

import bisect

li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
li.sort()
print(li)
print(bisect.bisect_left(li, 3))


result:
[1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
1

insort_left(a, x, lo=0, hi=None)

—— 在列表a中插入元素x,并在排序后保持排序。如果x已经在a中,把它插入右x的左边。

import bisect

li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
li.sort()
print(li)
bisect.insort_left(li, 3.0)
print(li)

result:

[1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
[1, 3.0, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]