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:  <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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章