总结写在前面,三个方法:
假设有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首和尾的空行就被去除了。
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)