讀操作
總結寫在前面,三個方法:
- 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: <class 'str'>
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: <class 'list'>
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: <class 'list'>
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: <class 'list'>
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: <class 'list'>
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: <class 'list'>
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)