Python處理CSV檔案的幾個方法

ckxllf發表於2021-03-01

  篩選特定的行

  有些時候,你並不需要檔案中所有的資料。例如,你可能只需要一個包含特定詞或數字的行的子集,或者是與某個具體日期關聯的行的子集。在這些情況下,可以用 Python 篩選出特定的行來使用。

  你應該很熟悉如何在 Excel 中手動篩選行,使你既能處理因為體積太大以致 Excel 不能開啟的 CSV 檔案,又能處理多個 CSV 檔案。因為要透過手動處理這些檔案,時間花費太多了。

  下面演示了在輸入檔案中篩選出特定行的 3 種方法:

  行中的值滿足某個條件

  行中的值屬於某個集合

  行中的值匹配於某個模式(正規表示式)

  接下來會詳細解釋這種通用結構,使你可以輕鬆地修改程式碼來滿足自己的業務規則。

  請注意以下結構,從而來理解如何從輸入檔案中篩選出特定的行:

  for row in filereader:

  ***if value in row meets some business rule or set of rules:***

  do something

  else:

  do something else

  這段虛擬碼展示了用來在輸入檔案中篩選出特定行的通用程式碼結構。在下面,會修改封裝在 *** 之間的程式碼,以使指令碼能夠滿足具體業務規則,抽取出你需要的資料。

  行中的值滿足某個條件

  基礎Python

  有些時候,當行中的值滿足一個具體條件時,才需要保留這些行。例如,你可能會希望在資料集中保留那些成本高於某個具體閾值的行,或者希望保留所有購買日期在一個具體日期之前的行。在這種情況下,你可以檢驗行中的值是否滿足具體的條件,然後篩選出滿足條件的行。

  下面的示例演示了檢驗行值是否滿足兩個具體條件的方法,並將滿足條件的行的子集寫入一個輸出檔案。在這個示例中,保留供應商名字為 Supplier Z 或成本大於 $600.00 的行,並將結果寫入輸出檔案。要篩選出滿足這些條件的行的子集,在文字編輯器中輸入以下程式碼,將檔案儲存為 3csv_reader_value_meets_condition.py:

  1 #!/usr/bin/env python3

  2 import csv

  3 import sys

  4 input_file = sys.argv[1]

  5 output_file = sys.argv[2]

  6 with open(input_file, 'r', newline='') as csv_in_file:

  7 with open(output_file, 'w', newline='') as csv_out_file:

  8 filereader = csv.reader(csv_in_file)

  9 filewriter = csv.writer(csv_out_file)

  10 header = next(filereader)

  11 filewriter.writerow(header)

  12 for row_list in filereader:

  13 supplier = str(row_list[0]).strip()

  14 cost = str(row_list[3]).strip('$').replace(',', '')

  15 if supplier == 'Supplier Z' or float(cost) > 600.0:

  16 filewriter.writerow(row_list)

  第 10 行程式碼使用 csv 模組的 next 函式讀出輸入檔案的第一行,賦給名為 header 的列表變數。第 11 行程式碼將標題行寫入輸出檔案。

  第 13 行程式碼取出每行資料中的供應商名字,並賦給名為 supplier 的變數。這行程式碼使用列表索引取出每行資料的第一個值 row[0],然後使用 str 函式將其轉換為一個字串。在此之後,使用 strip 函式刪除字串兩端的空格、製表符和換行符。最後,將處理好的字串賦給變數 supplier。

  第 14 行程式碼取出每行資料中的成本,並賦給名為 cost 的變數。這行程式碼使用列表索引取出每行資料的第四個值 row[3],然後使用 str 函式將其轉換為一個字串。在此之後,使用 strip 函式從字串中刪除美元符號。接著使用 replace 函式從字串中刪除逗號。最後,將處理好的字串賦給變數 cost。

  第 15 行程式碼建立了一個 if 語句,來檢驗每行中的這兩個值是否滿足條件。具體來說,這裡想篩選出供應商名字為 Supplier Z 或者成本大於 $600.00 的那些行。if 和 or 之間的第一個條件檢驗變數 supplier 中的值是否為 Supplier Z。or 和冒號之間的第二個條件檢驗變數 cost 中的值在被轉換為浮點數之後,是否大於 600.0。

  第 16 行程式碼使用 filewriter 的 writerow 函式將滿足條件的行寫入輸出檔案。

  要執行這個指令碼,輸入以下命令,然後按Enter鍵:

  python 3csv_reader_value_meets_condition.py supplier_data.csv\

  output_files\3output.csv

  在螢幕上你不會看到任何輸出,但可以開啟輸出檔案 3output.csv 看一下結果。檢查一下,確保結果正確,然後可以修改一下程式碼,設定不同的供應商或成本閾值,試著篩選一下其他資料。

  pandas

  pandas 提供了一個 loc 函式,可以同時選擇特定的行與列。你需要在逗號前面設定行篩選條件,在逗號後面設定列篩選條件。下面的 loc 函式中的條件設定為:Supplier Name 列中姓名包含 Z,或者 Cost 列中的值大於 600.0,並且需要所有的列。在文字編輯器中輸入以下程式碼,將檔案儲存為 pandas_value_meets_condition.py(這個指令碼使用 pandas 來分析 CSV 檔案,並將滿足條件的行寫入輸出檔案)。

  #!/usr/bin/env python3

  import pandas as pd

  import sys

  input_file = sys.argv[1]

  output_file = sys.argv[2]

  data_frame = pd.read_csv(input_file)

  data_frame['Cost'] = data_frame['Cost'].str.strip('$').astype(float)

  data_frame_value_meets_condition = data_frame.loc[(data_frame['Supplier Name']\

  .str.contains('Z')) | (data_frame['Cost'] > 600.0), :]

  data_frame_value_meets_condition.to_csv(output_file, index=False)

  在命令列中執行指令碼,並給出資料來源檔案和輸出檔案。

  python pandas_value_meets_condition.py supplier_data.csv\

  output_files\pandas_output.csv

  在螢幕上你不會看到任何輸出,但可以開啟輸出檔案 pandas_output.csv 看一下結果。試試修改一下 loc 函式中的引數,選擇出另外一些資料。

  行中的值屬於某個集合

  基礎Python

  有些時候,當行中的值屬於某個集合時,才需要保留這些行。例如,你可能會希望在資料集中保留那些供應商名字屬於集合 {Supplier X, Supplier Y} 的行(這裡的花括號表示集合,不是 Python 中的字典),或者希望保留所有購買日期屬於集合 {‘1/20/14’, ‘1/30/14’} 的行。在這種情況下,你可以檢驗行中的值是否屬於某個集合,然後篩選出具有屬於該集合的值的行。

  下面的示例演示了檢驗行值是否是集合成員的方法,並將具有集合中的值的行寫入到輸出檔案。在這個示例中,是要保留那些購買日期屬於集合 {‘1/20/14’, ‘1/30/14’} 的行,並將結果寫入輸出檔案。要篩選出值屬於這個集合的行的子集,在文字編輯器中輸入以下程式碼,並將檔案儲存為 4csv_reader_value_in_set.py:

  1 #!/usr/bin/env python3

  2 import csv

  3 import sys

  4 input_file = sys.argv[1]

  5 output_file = sys.argv[2]

  6 important_dates = ['1/20/14', '1/30/14']

  7 with open(input_file, 'r', newline='') as csv_in_file:

  8 with open(output_file, 'w', newline='') as csv_out_file:

  9 filereader = csv.reader(csv_in_file)

  10 filewriter = csv.writer(csv_out_file)

  11 header = next(filereader)

  12 filewriter.writerow(header)

  13 for row_list in filereader:

  14 a_date = row_list[4]

  15 if a_date in important_dates:

  16 filewriter.writerow(row_list)

  第 6 行程式碼建立了一個名為 important_dates 的列表變數,其中包含兩個特定日期,這個變數就是你的集合。建立包含特定值的變數,然後在程式碼中引用變數,這種編寫程式碼的方式非常有用。使用了這種方式,如果變數值發生了變化,你只需在一個地方修改程式碼(就是定義變數的地方),變數值的變化就會反映到程式碼中所有引用該變數的地方。

  第 14 行程式碼取出每一行的購買日期,並將其賦給變數 a_date。從行列表的索引值 row[4] 可知,購買日期在第 5 列。

  第 15 行程式碼建立了一個 if 語句來檢驗 a_date 變數中的購買日期是否屬於 important_dates 這個集合。如果變數值在集合中,下一行程式碼就將這一行寫入輸出檔案。

  在命令列中執行下面指令碼:

  python 4csv_reader_value_in_set.py supplier_data.csv output_files/4output.csv

  你可以開啟輸出檔案 4output.csv 來檢查結果。

  pandas

  當行中的值屬於某個集合時,如何使用 pandas 篩選出這些行呢?在文字編輯器中輸入以下程式碼,然後將檔案儲存為 pandas_value_in_set.py(這個指令碼分析 CSV 檔案,並將值屬於某個集合的行寫入輸出檔案):

  #!/usr/bin/env python3

  import pandas as pd

  import sys

  input_file = sys.argv[1]

  output_file = sys.argv[2]

  data_frame = pd.read_csv(input_file)

  important_dates = ['1/20/14', '1/30/14']

  data_frame_value_in_set = data_frame.loc[data_frame['Purchase Date'].\

  isin(important_dates), :]

  data_frame_value_in_set.to_csv(output_file, index=False)

  這裡最重要的新命令就是簡潔的 isin。

  和以前一樣,在命令列中執行指令碼,並給出源資料檔名和輸出檔名:

  python pandas_value_in_set.py supplier_data.csv output_files\pandas_output.csv

  你可以開啟輸出檔案 pandas_output.csv 來檢查結果。

  行中的值匹配於某個模式/正規表示式

  基礎Python

  有些時候,當行中的值匹配了或包含了一個特定模式(也就是正規表示式)時,才需要保留這些行。例如,你可能會希望在資料集中保留所有發票編號開始於“001-”的行,或者希望保留所有供應商名字中包含“Y”的行。在這種情況下,你可以檢驗行中的值是否匹配或包含某種模式,然後篩選出匹配了或包含了該模式的行。

  下面的示例演示瞭如何檢驗某個值是否匹配特定的模式,並將具有這種值的行寫入輸出檔案。在這個示例中,保留髮票編號由“001-”開頭的行,並將結果寫入一個輸出檔案。要篩選出某個值匹配了這個模式的行,在文字編輯器中輸入下列程式碼,然後將檔案儲存為 5csv_reader_value_matches_pattern.py:

  1 #!/usr/bin/env python3

  2 import csv

  3 import re

  4 import sys

  5 input_file = sys.argv[1]

  6 output_file = sys.argv[2]

  7 pattern = re.compile(r'(?P^001-.*)', re.I)

  8 with open(input_file, 'r', newline='') as csv_in_file:

  9 with open(output_file, 'w', newline='') as csv_out_file:

  10 filereader = csv.reader(csv_in_file)

  11 filewriter = csv.writer(csv_out_file)

  12 header = next(filereader)

  13 filewriter.writerow(header)

  14 for row_list in filereader:

  15 invoice_number = row_list[1]

  16 if pattern.search(invoice_number):

  17 filewriter.writerow(row_list)

  第 3 行程式碼匯入正規表示式(re)模組,這樣就可以使用 re 模組中的函式了。

  第 7 行程式碼使用 re 模組的 compile 函式建立一個名為 pattern 的正規表示式變數。r 表示將單引號之間的模式當作原始字串來處理。

  元字元 ?P 捕獲了名為 的組中匹配了的子字串,以便在需要時將它們列印到螢幕或寫入檔案。

  這裡要搜尋的實際模式是001-.*。插入符號()是一個特殊符號,表示只在字串開頭搜尋模式。所以,字串需要以“001-”開頭。句點 . 可以匹配任何字元,除了換行符。所以除換行符之外的任何字元都可以跟在“001-”後面。最後,* 表示重複前面的字元 0 次或更多次。.* 組合在一起用來表示除換行符之外的任意字元可以在“001-”後面出現任意次。更通俗的說法是:字串在“-”後面可以包含任意值,只要字串開始於“001-”,就會匹配正規表示式。

  最後,引數 re.I 告訴正規表示式進行大小寫敏感的匹配。此引數在這個示例中不是太重要,因為模式是數值型的,但是它說明了在模式中包含字元並且需要進行大小寫敏感的匹配時,應該如何設定引數。

  第 15 行程式碼使用列表索引從行中取出發票編號,並賦給變數 invoice_number。在下一行中,將在這個變數中尋找模式。

  第 16 行程式碼使用 re 模組的 search 函式在 invoice_number 的值中尋找模式。如果模式出現在 invoice_number 值中,第 17 行程式碼就將這行寫入輸出檔案。

  要執行這個指令碼,在命令列中輸入以下命令,然後按Enter鍵:

  python 5csv_reader_value_matches_pattern.py supplier_data.csv\

  output_files\5output.csv

  你可以開啟輸出檔案 5output.csv 來檢視結果。

  pandas

  要使用 pandas 篩選出匹配於某個模式的行,在文字編輯器中輸入下列程式碼,然後將檔案儲存為 pandas_value_matches_pattern.py(這個指令碼讀取 CSV 檔案,將匹配於某個模式的行列印在螢幕上,並將同樣的行寫入輸出檔案):

  #!/usr/bin/env python3

  import pandas as pd

  import sys

  input_file = sys.argv[1]

  output_file = sys.argv[2]

  data_frame = pd.read_csv(input_file)

  data_frame_value_matches_pattern = data_frame.loc[data_frame['Invoice Number'].\

  str.startswith("001-"), :]

  data_frame_value_matches_pattern.to_csv(output_file, index=False)

  使用 pandas 時,可以使用 startwith 函式來搜尋資料,不用再使用笨重冗長的正規表示式了。要執行這個指令碼,在命令列中輸入以下命令,然後按Enter鍵:

  python pandas_value_matches_pattern.py supplier_data.csv\

  output_files\pandas_output.csv

  你可以開啟輸出檔案 pandas_output.csv 檢視一下結果。

  選取特定的列

  有些時候,你並不需要檔案中所有的列。可以使用 Python 選取出你需要的列。

  有兩種通用方法可以在 CSV 檔案中選取特定的列。下面演示了這兩種方法:

  使用列索引值

  使用列標題

  列索引值

  基礎Python

  在 CSV 檔案中選取特定列的一種方法是使用你想保留的列的索引值。當你想保留的列的索引值非常容易識別,或者在處理多個輸入檔案時,各個輸入檔案中列的位置一致(也就是不會發生改變)的時候,這種方法非常有效。例如,如果你只需要保留資料的第一列和最後一列,那麼你可以使用 row[0] 和 row[-1] 來將每行的第一個值和最後一個值寫入檔案。

  在這個示例中,你只想保留供應商姓名和成本這兩列。要使用索引值選取這兩列,在文字編輯器中輸入下列程式碼,然後將檔案儲存為 6csv_reader_column_by_index.py:

  1 #!/usr/bin/env python3

  2 import csv

  3 import sys

  4 input_file = sys.argv[1]

  5 output_file = sys.argv[2]

  6 my_columns = [0, 3]

  7 with open(input_file, 'r', newline='') as csv_in_file:

  8 with open(output_file, 'w', newline='') as csv_out_file:

  9 filereader = csv.reader(csv_in_file)

  10 filewriter = csv.writer(csv_out_file)

  11 for row_list in filereader:

  12 row_list_output = [ ]

  13 for index_value in my_columns:

  14 row_list_output.append(row_list[index_value])

  15 filewriter.writerow(row_list_output)

  第 6 行程式碼建立了一個列表變數 my_columns,其中包含了你想保留的兩列的索引值。在這個示例中,這兩個索引值對應著供應商姓名和成本列。再說一次,應該建立一個包含索引值的變數,然後在程式碼中引用這個變數。這樣,如果索引值需要改變的話,你只需要在一個地方(就是定義 my_columns 的地方)修改即可,修改會反映到程式碼中所有引用 my_columns 的地方。

  第 12~15 行程式碼是 for 迴圈下面縮排的部分,所以對於輸入檔案中的每一行都要執行這些程式碼。第 12 行程式碼建立了一個空列表變數 row_list_output。這個變數儲存你在每行中要保留的值。第 13 行程式碼是一個 for 迴圈語句,在 my_cloumns 中的各個索引值之間進行迭代。第 14 行程式碼透過列表的 append 函式使用每行中 my_columns 索引位置的值為 row_list_output 填充元素。這 3 行程式碼生成了一個列表,列表中包含了每行中你要寫入輸出檔案的值。建立列表是有用的,因為 filewriter 的 writerow 方法需要一個字串序列或數值序列,而列表 row_list_out 正是一個字串序列。第 15 行程式碼將 row_list_output 中的值寫入輸出檔案。

  指令碼會對輸入檔案中的每一行執行這些程式碼。為了確切地理解這一系列操作,下面來看看第一次外部 for 迴圈做了些什麼。在本例中,你處理的是輸入檔案中的第一行(也就是標題行)。第 12 行程式碼建立了空列表變數 row_list_output。第 13 行程式碼是一個 for 迴圈,在 my_columns 的值之間迭代。

  第一次迴圈時,index_value 等於 0,所以第 14 行程式碼中的 append 函式將 row[0](就是供應商姓名字串)加入 row_list_output。此後,程式碼回到第 13 行中的 for 迴圈,這一次 index_value 等於 3。因為 index_value 等於 3,所以第 14 行程式碼中的 append 函式將 row[3](也就是成本字串)加入 row_list_output。my_columns 中沒有更多的值了,所以第 13 行中的 for 迴圈結束,程式碼前進到第 15 行。第 15 行程式碼將 row_list_output 中的列表值寫入輸出檔案。然後,程式碼回到第 11 行中的外部 for 迴圈,開始處理輸入檔案中的下一行。

  要執行這個指令碼,在命令列中輸入以下命令,然後按Enter鍵:

  python 6csv_reader_column_by_index.py supplier_data.csv output_files\6output.csv

  你可以開啟輸出檔案 6output.csv 檢視一下結果。

  pandas

  要使用 pandas 根據索引值選取列,在文字編輯器中輸入下列程式碼,然後將檔案儲存為 pandas_column_by_index.py(這個指令碼讀取 CSV 檔案,將索引值為 0 和 3 的列列印到螢幕,並將同樣的行寫入輸出檔案):

  #!/usr/bin/env python3

  import pandas as pd

  import sys

  input_file = sys.argv[1]

  output_file = sys.argv[2]

  data_frame = pd.read_csv(input_file)

  data_frame_column_by_index = data_frame.iloc[:, [0, 3]]

  data_frame_column_by_index.to_csv(output_file, index=False)

  這裡使用了 iloc 函式來根據索引位置選取列。

  在命令列中執行以下指令碼:

  python pandas_column_by_index.py supplier_data.csv\

  output_files\pandas_output.csv

  你可以開啟輸出檔案 pandas_output.csv 檢視一下結果。

  列標題

  基礎Python

  在 CSV 檔案中選取特定列的第二種方法是使用列標題,而不是索引位置。當你想保留的列的標題非常容易識別,或者在處理多個輸入檔案時,各個輸入檔案中列的位置會發生改變,但標題不變的時候,這種方法非常有效。

  舉例來說,假設你只需要保留髮票號碼列和購買日期列。要使用列標題選取這兩列,在文字編輯器中輸入下列程式碼,然後將檔案儲存為 7csv_reader_column_by_name.py:

  1 #!/usr/bin/env python3

  2 import csv

  3 import sys

  4 input_file = sys.argv[1]

  5 output_file = sys.argv[2]

  6 my_columns = ['Invoice Number', 'Purchase Date']

  7 my_columns_index = []

  8 with open(input_file, 'r', newline='') as csv_in_file:

  9 with open(output_file, 'w', newline='') as csv_out_file:

  10 filereader = csv.reader(csv_in_file)

  11 filewriter = csv.writer(csv_out_file)

  12 header = next(filereader, None)

  13 for index_value in range(len(header)):

  14 if header[index_value] in my_columns:

  15 my_columns_index.append(index_value)

  16 filewriter.writerow(my_columns)

  17 for row_list in filereader:

  18 row_list_output = [ ]

  19 for index_value in my_columns_index:

  20 row_list_output.append(row_list[index_value])

  21 filewriter.writerow(row_list_output)

  這個示例中的程式碼比上一個示例要稍微長一點,但是所有程式碼看起來都很熟悉。此示例中有更多程式碼的唯一原因就是,你需要先單獨處理一下標題行,識別出相應標題行對應的索引值。然後你可以使用索引值保留每行中的值,這些值和要保留的列標題具有同樣的索引值。

  第 6 行程式碼建立了一個列表變數 my_columns,其中包含了兩個字串,即要保留的兩列的名字。第 7 行程式碼建立了一個空列表變數 my_columns_index,要使用兩個保留列的索引值來填充它。

  第 12 行程式碼在 filereader 物件上使用 next 函式從輸入檔案中讀出第一行,並儲存在列表變數 header 中。第 13 行程式碼初始化在列標題的索引值中迭代的 for 迴圈。

  第 14 行程式碼使用 if 語句和列表索引來檢驗每個列標題是否在 my_columns 中。例如,第一次 for 迴圈時,index_value 等於 0,所以 if 語句檢驗 header[0](也就是第一個列標題供應商姓名)是否在 my_columns 中。因為供應商姓名不在 my_columns 中,所以第 15 行程式碼不會對這個值執行。

  程式碼返回第 13 行中的 for 迴圈,這一次 index_value 等於 1。然後,第 14 行程式碼中的 if 語句檢驗 header[1](也就是第二個列標題發票號碼)是否在 my_columns 中。因為發票號碼在 my_columns 中,所以執行第 15 行程式碼,將這列的索引值加入到 my_columns_index 列表中。

  然後繼續 for 迴圈,最後將購買日期列的索引值加入 my_columns_index。一旦 for 迴圈結束,第 16 行程式碼就將 my_columns 中的兩個字串寫入輸出檔案。

  第 18~21 行程式碼處理輸入檔案中餘下的資料行。第 18 行程式碼建立一個空列表 row_list_output 來儲存你要在每一行中保留的值。第 19 行程式碼中的 for 迴圈在 my_columns_index 中的索引值之間迭代,第 20 行程式碼將資料行中具有這些索引值的值加入 row_list_output。最後,第 21 行程式碼將 row_list_output 中的值寫入輸出檔案。

  在命令列中執行以下指令碼:

  python 7csv_reader_column_by_name.py supplier_data.csv output_files\7output.csv

  你可以開啟輸出檔案 7output.csv 檢視一下結果。

  pandas

  要使用 pandas 根據列標題選取列,在文字編輯器中輸入下列程式碼,然後將檔案儲存為 pandas_column_by_name.py(這個指令碼讀取 CSV 檔案,將發票號碼列與購買日期列列印到螢幕,並將同樣的列寫入輸出檔案):

  #!/usr/bin/env python3

  import pandas as pd

  import sys

  input_file = sys.argv[1]

  output_file = sys.argv[2]

  data_frame = pd.read_csv(input_file)

  data_frame_column_by_name = data_frame.loc[:, ['Invoice Number', 'Purchase Date']]

  data_frame_column_by_name.to_csv(output_file, index=False)

  這裡又一次使用 loc 函式來選取列,這次使用的是列標題。

  執行以下指令碼:

  python pandas_column_by_name.py supplier_data.csv output_files\pandas_output.csv

  你可以開啟輸出檔案 pandas_output.csv 檢視一下結果。

  選取連續的行

  有些時候,在檔案內容中,工作表頭部和尾部都是你不想處理的。例如,檔案頭部可能是標題和作者資訊,檔案尾部也可能會列出來源、假設、附加說明和注意事項。在很多情況下,你不需要處理這些內容。

  為了演示如何在 CSV 檔案中選取連續的行,需要對輸入檔案做如下修改。

  (1) 在電子表格軟體中開啟 supplier_data.csv。

  (2) 在檔案頭部插入 3 行,就在列標題那行的上面。

  在 A1:A3 單元格中隨便寫一些文字,比如“I don’t care about this line”。

  (3) 在檔案尾部,也就是最後一行資料下面插入 3 行。

  在最後一行資料下面 A 列的 3 個單元格中隨便寫一些文字,比如“I don’t want this line either”。

  (4) 將檔案儲存為 supplier_data_unnecessary_header_footer.csv。這個檔案應該如圖 2-10 所示。

  圖 2-10:在你需要的行上方和下方具有無關資料的 CSV 檔案

  現在輸入檔案中包含了你不需要的頭部和尾部資訊,修改一下 Python 指令碼,使它不讀取這些行。

  基礎Python 大連婦科醫院哪個好

  要使用基礎 Python 選取特定行,這裡使用 row_counter 變數來跟蹤行編號,以便可以識別和選取想保留的行。從前面的示例中,你已經知道了要保留 13 行資料。在下面的 if 程式碼塊中,你可以看到你要寫入輸出檔案中的行就是行索引大於等於 3 並小於等於 15 的行。

  要使用基礎 Python 選取這些行,在文字編輯器中輸入下列程式碼,然後將檔案儲存為 11csv_reader_select_contiguous_rows.py:

  1 #!/usr/bin/env python3

  2 import csv

  3 import sys

  4 input_file = sys.argv[1]

  5 output_file = sys.argv[2]

  6 row_counter = 0

  7 with open(input_file, 'r', newline='') as csv_in_file:

  8 with open(output_file, 'w', newline='') as csv_out_file:

  9 filereader = csv.reader(csv_in_file)

  10 filewriter = csv.writer(csv_out_file)

  11 for row in filereader:

  12 if row_counter >= 3 and row_counter <= 15:

  13 filewriter.writerow([value.strip() for value in row])

  14 row_counter += 1

  這裡使用 row_counter 變數和一個 if 語句來保留需要的行,跳過那些不需要的頭部和尾部內容。對於輸入檔案的前 3 行,因為 row_counter 小於 3,所以不執行 if 程式碼塊,並將 row_counter 的值增加 1。

  對於輸入檔案的最後 3 行,row_counter 大於 15,所以也不執行 if 程式碼塊,並將 row_counter 的值增加 1。

  你要保留的行在無用的頭部和尾部之間。對於這些行,row_counter 在 3 和 15 之間。if 程式碼塊處理這些行並將它們寫入輸出檔案。在列表生成式中使用 string 模組的 strip 函式除去每行兩端的空格、製表符和換行符。

  如果想看看 row_counter 變數的值和每行的內容,可以在現有的 writerow 語句上面加上一個 print 語句,比如 print(row_counter, [value.strip() for value in row])。

  要執行這個指令碼,在命令列中輸入以下命令,然後按Enter鍵:

  python 11csv_reader_select_contiguous_rows.py supplier_data_unnecessary_header_\

  footer.csv output_files\11output.csv

  你可以開啟輸出檔案 11output.csv 檢視一下結果。

  pandas

  pandas 提供了 drop 函式根據行索引或列標題來丟棄行或列。在下面的指令碼中,drop 函式從輸入檔案中丟棄前 3 行和最後 3 行(也就是行索引為 0,1,2 和 16,17,18 的那些行)。pandas 還提供了功能強大的 iloc 函式,你可以使用這個函式根據行索引選取一個單獨行作為列索引。最後,使用 reindex 函式為資料框重新生成索引。

  使用 pandas 可以保留列標題行和資料行,除去不需要的頭部和尾部。在文字編輯器中輸入下列程式碼,並將檔案儲存為 pandas_select_contiguous_rows.py:

  #!/usr/bin/env python3

  import pandas as pd

  import sys

  input_file = sys.argv[1]

  output_file = sys.argv[2]

  data_frame = pd.read_csv(input_file, header=None)

  data_frame = data_frame.drop([0,1,2,16,17,18])

  data_frame.columns = data_frame.iloc[0]

  data_frame = data_frame.reindex(data_frame.index.drop(3))

  data_frame.to_csv(output_file, index=False)

  要執行這個指令碼,在命令列中輸入以下命令,然後按Enter鍵:

  python pandas_select_contiguous_rows.py supplier_data_unnecessary_header_\

  footer.csv output_files\pandas_output.csv

  你可以開啟輸出檔案 pandas_output.csv 檢視一下結果。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2760253/,如需轉載,請註明出處,否則將追究法律責任。

相關文章