python文本txt处理

读操作

总结写在前面,三个方法:

  • read() + splitlines()
  • readlines() + strip()
  • readline() + 循环

假设有test.txt文件内容为:

banana,apple,orange
cat, dog, pig
father, mother, child
man, woman, human

三种写法:
1. read()方法

with open('test.txt') as f:
    data = f.read()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出:

type:  
len:  76
data: 
banana,apple,orange
cat, dog, pig
father, mother, child
man, woman, human

可以看出,read()方法把整个txt的内容读入,且作为一个字符串来处理。那如果我们想要按行分开,可以调用字符串的splitlines()方法,将字符串分为字符串list。spitines()以换行符\n,回车符\r, 回车+换行\r\n为标志,将字串分开。

with open('test.txt') as f:
    data = f.read().splitlines()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出:

type:  
len:  4
data: 
['banana,apple,orange', 'cat, dog, pig', 'father, mother, child', 'man, woman, human']

ps:splitlines()将字串分开成字串列表,.join()方法可以将列表组合成字串:

print("".join(data))

输出:

banana,apple,orangecat, dog, pigfather, mother, childman, woman, human

2. readlines()方法

with open('test.txt') as f:
    data = f.readlines()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出:

type:  
len:  4
data: 
['banana,apple,orange\n', 'cat, dog, pig\n', 'father, mother, child\n', 'man, woman, human\n']

可以看到,输出结果是以每行的字串为一个元素,组成了字符串列表。但是和read()+splitlines()方法的区别是,每一个元素多了一个\n回车符,也就是readlines()默认是不会去除行尾的换行符的。需要用strip()方法来手动去除。代码如下:

with open('test.txt') as f:
    data = f.readlines()
    data = [d.strip() for d in data]
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出如下:

type:  
len:  4
data: 
['banana,apple,orange', 'cat, dog, pig', 'father, mother, child', 'man, woman, human']

strip()方法如果不写参数,则用于去除字串首尾的空白字符,包括空格,回车,换行。注意只去除首尾,不去除中间
strip()如果带参数,则参数中的每一个字符,都在行首和行尾进行匹配,遇到了,就进行消除。

string = '  \r  \n abc \r\n \n '

print(string.strip())
print(len(string.strip()))

输出如下:

abc
3
string = 'aaa0bbb0ccc'

print("a: ", string.strip("a"))
print("0: ", string.strip("0"))
print("b: ", string.strip("b"))
print("c: ", string.strip("c"))
print("0abc: ", string.strip("0abc"))

输出:

a:  0bbb0ccc
0:  aaa0bbb0ccc
b:  aaa0bbb0ccc
c:  aaa0bbb0
0abc:  

可以看到“0abc”输出为空。
现在可以理解上文那句:**“则参数中的每一个字符,都在行首和行尾进行匹配,遇到了,就进行消除。”**了吧。

3. readline()方法
readline()跟readlines()类似,但是一次只能读一行,所以需要循环控制。

with open('test.txt') as f:
    while True:
        line = f.readline()
        if not line:
            break
        print(line)

输出:

banana,apple,orange

cat, dog, pig

father, mother, child

man, woman, human

可以看到,行尾也是带\n回车的,使用strip()去除。

with open('test.txt') as f:
    while True:
        line = f.readline().strip()
        if not line:
            break
        print(line)

输出:

banana,apple,orange
cat, dog, pig
father, mother, child
man, woman, human

番外1. 去除文本开头和结尾的空行
经常会要到另外一种问题,在一个txt的文本的开头和结尾处,存在一些空行,对我们是无用的,需要进行去除,这个怎么操作?

很简单,结合上面讲到的方法,read()将整个文本当作一个字符串读入,strip()可以去除行首和行尾的空白字符,splitlines()可以将字串按照换行符进行分割,那么,解决方案如下:
假设文本内容为:


banana,apple,orange
cat, dog, pig
father, mother, child
man, woman, human




其中开头一个空行,结尾两个空行,
用1的方法:

with open('test.txt') as f:
    data = f.read().splitlines()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输入如下:

type:  
len:  8
data: 
['', 'banana,apple,orange', 'cat, dog, pig', 'father, mother, child', 'man, woman, human', '', '', '']

可以看到len为8,首尾多了几个空行。
处理代码如下:

with open('test.txt') as f:
    data = f.read().strip().splitlines()
    print("type: ", type(data))
    print("len: ", len(data))
    print("data: ")
    print(data)

输出:

type:  
len:  4
data: 
['banana,apple,orange', 'cat, dog, pig', 'father, mother, child', 'man, woman, human']

可以看到,将原来的data = f.read().splitlines()变为了data = f.read().strip().splitlines(),多加了.strip(), txt首和尾的空行就被去除了。

去掉txt 中的空格

def de_blank(file_name):
	with open(file_name) as f:
		data = f.read().strip().splitlines()
		data = [d.strip() for d in data] #去掉行首行尾空格
		data = [d for d in data if d[0]!='#'] #去掉注释行
		data = [d for d in data id d.find(':')<0] # 去掉包含:符号的行
		data = [d.replace(' ', '') for d in data] # 去掉行中的空格
		return data

其实上面的多行可以合并成一行:

def de_blank(file_name):
	with open(file_name) as f:
		data = f.read().strip().splitlines()
		data = [d.strip() for d in data] #去掉行首行尾空格
		data = [d.replace(' ','') for d in data if d[0]!='#' and d.find(':')<0]
		return data

一个非常机智的列表表达式

a = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6], 去除列表a中的元素0,如果元素0后面的元素为2的话。

a = [i[0] for i in zip(a, a[1:]+[None]) if x!=(0,2)]

实际应用

def txt2array(filename):
    with open(filename) as f:
        data = f.read().strip().splitlines()
        data = [d.strip() for d in data] #去掉行首行尾空格
        data = [d[1:-1] for d in data]
        data = [d.split(',') for d in data]
        return np.array(data, dtype=np.float64)

你可能感兴趣的:(python)