python中讀取txt文件時split()函數的妙用

不知道大傢有沒有過需要從txt文件中讀取含有多行多列的數據的經歷,當我們讀入數據時,數據會以string的形式被讀入,然而如何進行數據類型轉換就成瞭大的問題。

這裡介紹一種最簡單的方式和容易產生的錯誤使用方法。

txt測試文件中的數據如下

我們使用如下代碼讀取文件,使用readlines()一次性將所有數據全部讀取。

with open(r"C:\Users\15025\Desktop\debug1.txt", "r") as f:
    all_data = f.readlines()
    print(all_data)
# ['6.317438621610765E-05  6.123920173773844E-05  0.00010382572761752979\n', '0.00010819194873178063  8.848784016828921E-05  0.0002043378699454479\n', '9.79660835582763E-05  9.750829986943346E-05  0.00021506758227284687']

我們不難發現這時我們的所有數據都被讀入瞭同一行,但是內部有三個單引號括起來的部分,與我們測試數據中的三行吻合。

我們也可以看到,我們需要將這些數據分成單獨的string,然後我們就可以使用例如float關鍵字對這些數據進行類型轉換。

我們看到數據之間是通過空格來分開的。我們第一時間想到我們應該使用.split(" ")方法以空格將數據分開。

我們嘗試以下代碼

with open(r"C:\Users\15025\Desktop\debug1.txt", "r") as f:
    all_data = f.readlines()
    all_data = all_data[0].split(" ")
    print(all_data)
# ['6.317438621610765E-05', '', '6.123920173773844E-05', '', '0.00010382572761752979\n']

首先我們需要選取第一行,使用all_data[0],然後再使用split(" ")函數分開它們。

我們成功達到瞭目的,但是我們同時引入瞭""空字符串項和末尾處\n的隱患,很是棘手。

這麼做我們就進入瞭誤區。

正確地做法如下

with open(r"C:\Users\15025\Desktop\debug1.txt", "r") as f:
    all_data = f.readlines()
    all_data = all_data[0].split()
    print(all_data)
# ['6.317438621610765E-05', '6.123920173773844E-05', '0.00010382572761752979']

我們使用split()函數時不添加任何參數,這樣就一次性去掉瞭""空字符串項和末尾處\n的隱患還同時分開瞭各個字符串。

如果需要輸出多行的結果,我們可以預先定義一個數組,用來存放我們的數據,完整代碼如下:(以後所有的多行多列數據均可以如此讀入)

方法一:將數據以二維列表形式讀入

array2d = []
with open(r"C:\Users\15025\Desktop\debug1.txt", "r") as f:
    all_data = f.readlines()
    for i in range(len(all_data)):
        temp_list = []
        for element in all_data[i].split():
            temp_list.append(float(element))
        array2d.append(temp_list)

print(array2d)
#[[6.31743862e-05, 6.12392017e-05, 0.000103825728], 
# [0.000108191949, 8.84878402e-05, 0.00020433787], 
# [9.79660836e-05, 9.75082999e-05, 0.000215067582]]

方法二:將數據以二維數組形式讀入

import numpy as np

array = np.zeros((3, 3))
with open(r"C:\Users\15025\Desktop\debug1.txt", "r") as f:
    all_data = f.readlines()
    for i, line in enumerate(all_data):
        numbers = line.split()
        for j, element in enumerate(numbers):
            array[i, j] = float(element)

print(array)
# [[6.31743862e-05 6.12392017e-05 1.03825728e-04]
#  [1.08191949e-04 8.84878402e-05 2.04337870e-04]
#  [9.79660836e-05 9.75082999e-05 2.15067582e-04]]

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: