【Pythonを使いこなす100日目】27日目:ファイルとIO操作_CSVファイル処理

目次

 コラムガイド 

 1. CSV ファイル形式の概要

2 csvモジュールの使い方

3 CSVファイルの読み書き例

3.1 CSVファイルの読み込み例

3.2 CSVファイルの書き込み例

4 CSVファイルの共通データ処理

4.1 CSV ファイルの特定の列を読み取る

4.2 CSV ファイルの特定の行を読み取る

5 csv ファイルの特別な処理

5.1 カンマ、改行、引用符を含むフィールドの処理

5.2 非 ASCII 文字の処理 

5.3 空のフィールドの処理 

5.3.1 空のフィールドの読み取り

5.3.2 空のフィールドを処理するためのパラメータの指定


 コラムガイド 

コラム購読アドレス:https://blog.csdn.net/qq_35831906/category_12375510.html


 1. CSV ファイル形式の概要

        CSV (カンマ区切り値) は、表形式のデータを保存するために使用される一般的なテキスト ファイル形式です。各行はレコードを表し、各フィールドはカンマまたはその他の特定の区切り文字で区切られます。CSV ファイルは、プレーン テキスト エディタで開くことも、スプレッドシート ソフトウェア (Microsoft Excel、Google Sheets など) で編集することもできます。

csvモジュールの使い方

Python のモジュールは、 csvCSV ファイルを操作するための関数を提供します。これには、CSV ファイルを読み書きするためのさまざまなメソッドとオブジェクト ( csv.readercsv.writercsv.DictReaderなどcsv.DictWriter)が含まれています。

3 CSVファイルの読み書き例

3.1 CSVファイルの読み込み例

次のような名前の CSV ファイルがあるとしますdata.csv

Name,Age,City
John,30,New York
Jane,25,San Francisco
Mike,35,Chicago

csv.readerこの CSV ファイルを読み取って処理するには、次を使用します。

import csv

# 读取CSV文件并处理数据
with open('data.csv', 'r', newline='') as file:
    csv_reader = csv.reader(file)
    
    # 遍历每一行数据
    for row in csv_reader:
        print(row)

出力:

['Name', 'Age', 'City']
['John', '30', 'New York']
['Jane', '25', 'San Francisco']
['Mike', '35', 'Chicago']

3.2 CSVファイルの書き込み例

ここで、新しい CSV ファイルに書き込む一連の辞書データがあるとしますoutput.csv

import csv

# 要写入的数据
data = [
    {"Name": "Alice", "Age": 28, "City": "London"},
    {"Name": "Bob", "Age": 32, "City": "Paris"},
    {"Name": "Eve", "Age": 24, "City": "Berlin"}
]

# 写入CSV文件
with open('output.csv', 'w', newline='') as file:
    fieldnames = ['Name', 'Age', 'City']
    csv_writer = csv.DictWriter(file, fieldnames=fieldnames)

    # 写入表头
    csv_writer.writeheader()

    # 写入数据
    csv_writer.writerows(data)

print("Data has been written to output.csv.")

出力: 

Name,Age,City
Alice,28,London
Bob,32,Paris
Eve,24,Berlin

4 CSVファイルの共通データ処理

4.1 CSV ファイルの特定の列を読み取る

CSV ファイルを        通過csv.readerまたは読み取った後、必要な列データのみが処理のために保持されます。csv.DictReader列インデックスまたは列名によって特定の列を指定できます。

: 次のような名前の CSV ファイルがあるとしますdata.csv

Name,Age,City
John,30,New York
Jane,25,San Francisco
Mike,35,Chicago

CSV ファイルの特定の列を読み取る 2 つの方法を示します。

方法 1: 列インデックスを使用する

import csv

# 读取CSV文件并获取特定列数据
with open('data.csv', 'r', newline='') as file:
    csv_reader = csv.reader(file)
    
    # 将列索引设为1(第二列Age)
    column_index = 1
    
    # 初始化存储特定列数据的列表
    specific_column_data = []
    
    # 遍历每一行数据
    for row in csv_reader:
        # 获取特定列的值,并添加到列表中
        specific_column_data.append(row[column_index])

print("Specific column data:", specific_column_data)

出力:

Specific column data: ['Age', '30', '25', '35']

方法 2: 列名を使用する

import csv

# 读取CSV文件并获取特定列数据
with open('data.csv', 'r', newline='') as file:
    csv_reader = csv.DictReader(file)
    
    # 将列名设为'Age'
    column_name = 'Age'
    
    # 初始化存储特定列数据的列表
    specific_column_data = []
    
    # 遍历每一行数据
    for row in csv_reader:
        # 获取特定列的值,并添加到列表中
        specific_column_data.append(row[column_name])

print("Specific column data:", specific_column_data)

出力

Specific column data: ['30', '25', '35']

csv.reader上記の例では、とをそれぞれ介して CSV ファイルを読み取りcsv.DictReader、特定の列インデックスまたは列名に従って必要な列データを抽出します。次に、後で処理できるように、特定の列のデータをリストに保存します。

注:使用するcsv.DictReaderと、データの各行は、キーが CSV ファイルの最初の行 (ヘッダー) の列名である辞書として解析されますこのようにして、列名によって特定の列の値にアクセスできます。使用するとcsv.reader、データの各行がリストとして解析され、列インデックスを通じて特定の列の値にアクセスできます。

4.2 CSV ファイルの特定の行を読み取る

        CSV ファイルの特定の行を読み取るには、csv.readerまたは を使用csv.DictReaderして CSV ファイルを 1 行ずつ読み取り、読み取りプロセス中に行番号が特定の条件を満たすかどうかを判断します。CSV ファイルの特定の行を使用しcsv.readerて読み取る例を次に示します。csv.DictReader

例 1: csv.reader を使用して特定の行を読み取る

次のような名前の CSV ファイルがあるとしますdata.csv

Name,Age,City
John,30,New York
Jane,25,San Francisco
Mike,35,Chicago

csv.readerCSV ファイルを読み取り、特定の行番号に従って対応する行データを取得するために使用できます。

import csv

# 读取CSV文件的特定行
def read_specific_row(csv_file, row_number):
    with open(csv_file, 'r', newline='') as file:
        csv_reader = csv.reader(file)
        for i, row in enumerate(csv_reader):
            if i == row_number:
                return row

# 读取第二行(索引为1)的数据
specific_row = read_specific_row('data.csv', 1)
print("Specific row data:", specific_row)

出力

Specific row data: ['Jane', '25', 'San Francisco']

例 2: csv.DictReader を使用して特定の行を読み取る

        CSV ファイルの最初の行が列名である場合、これを使用してcsv.DictReaderCSV ファイルを読み取り、特定の条件に基づいて特定の行のデータを取得できます。

import csv

# 读取CSV文件的特定行
def read_specific_row(csv_file, row_number):
    with open(csv_file, 'r', newline='') as file:
        csv_reader = csv.DictReader(file)
        for i, row in enumerate(csv_reader):
            if i == row_number:
                return row

# 读取第二行(索引为1)的数据
specific_row = read_specific_row('data.csv', 1)
print("Specific row data:", specific_row)

出力

Specific row data: {'Name': 'Jane', 'Age': '25', 'City': 'San Francisco'}

上記の例では、csv.readerと をcsv.DictReaderそれぞれ使用してCSVファイルを読み込み、特定の行番号(インデックス)から対応する行データを取得しました。Python のインデックスは 0 からカウントされるため、行番号は 0 から始まることに注意してください。必要に応じてrow_numberパラメータを調整して、別の行を読み取ることができます。

5 csv ファイルの特別な処理

CSV ファイルを扱う場合、特別な処理が必要となる一般的な特殊なケースがいくつかあります。一般的な特別な処理ケースをいくつか示します

5.1 カンマ、改行、引用符を含むフィールドの処理

        カンマ、引用符、改行を含む CSV ファイルを処理するには、Python のcsvモジュールを使用してデータの読み取りと書き込みを行うことができます。csvこのモジュールは、カンマ、引用符、改行を含むフィールドを引用符で囲んだり、引用符内で引用符をエスケープしたりするなど、特殊文字の自動処理を提供します。

例:

という名前の特殊文字を含む次の CSV ファイルを処理するとしますdata.csv

Name,Age,Description
John,30,"A software, ""guru"" with 5 years of experience. Fluent in English and Español."
Jane,25,"A data analyst with ""extensive"" skills. 
Passionate about data visualization."
Mike,35,"Project manager with experience leading international teams.
Deutsch sprechen."

次のコードを使用して、特殊文字を含むこの CSV ファイルを読み取り、処理できます。

import csv

# 读取包含特殊字符的CSV文件并输出内容
with open('data.csv', 'r', newline='') as file:
    csv_reader = csv.reader(file)
    for row in csv_reader:
        print(row)

出力結果

['Name', 'Age', 'Description']
['John', '30', 'A software, "guru" with 5 years of experience. Fluent in English and Español.']
['Jane', '25', 'A data analyst with "extensive" skills.\nPassionate about data visualization.']
['Mike', '35', 'Project manager with experience leading international teams.\nDeutsch sprechen.']

csv.reader出力では、モジュールがコンマ、引用符、改行を含むフィールドを正しく処理し、それらを正しいデータに解析していることが        わかります。

特殊文字を含むデータを CSV ファイルに書き込む場合は、次のサンプル コードを使用できます。

import csv

# 要写入的数据,包含特殊字符的字段
data = [
    ["Name", "Age", "Description"],
    ["John", 30, 'A software, "guru" with 5 years of experience. Fluent in English and Español.'],
    ["Jane", 25, 'A data analyst with "extensive" skills.\nPassionate about data visualization.'],
    ["Mike", 35, 'Project manager with experience leading international teams.\nDeutsch sprechen.']
]

# 写入CSV文件,并设置引号限定符为双引号
with open('output.csv', 'w', newline='') as file:
    csv_writer = csv.writer(file, quoting=csv.QUOTE_MINIMAL)

    # 写入数据
    csv_writer.writerows(data)

print("CSV file with fields containing special characters has been created.")

        データを書き込むときは、csv.writer引用符修飾子を使用して に設定しますcsv.QUOTE_MINIMAL。これは、データの正確性を保証するために必要な場合にのみフィールドが引用符で囲まれることを意味します。

出力ファイルの内容:

Name,Age,Description
John,30,A software, "guru" with 5 years of experience. Fluent in English and Español.
Jane,25,A data analyst with "extensive" skills.\nPassionate about data visualization.
Mike,35,Project manager with experience leading international teams.\nDeutsch sprechen.

        出力ファイルでは、csvモジュールは特殊文字を含むフィールドを自動的に処理し、CSV ファイルに書き込みます。

        CSV ファイルを読み取るときは、csv.reader特殊文字を含むデータを正しく解析するために、適切なパラメーターを使用および指定します。CSV ファイルに書き込む場合は、csv.writerデータが CSV ファイルに正しく書き込まれるように、適切な引用修飾子を使用および設定してください。

5.2 非 ASCII 文字の処理 

  • CSV ファイルの読み取りおよび書き込み時に、​encodingパラメーターを使用してファイルのエンコード形式を指定できます。
  • CSV ファイルは通常、非 ASCII 文字を含むテキスト データをサポートするために UTF-8 エンコーディングを使用します。
  • import csv
    
    # 读取包含非ASCII字符的CSV文件
    with open("data.csv", "r", encoding="utf-8") as file:
        csv_reader = csv.reader(file)
        for row in csv_reader:
            print(row)
    
    # 写入包含非ASCII字符的CSV文件
    data = [["中文", "English"], ["数据", "Data"]]
    with open("data.csv", "w", newline="", encoding="utf-8") as file:
        csv_writer = csv.writer(file)
        csv_writer.writerows(data)

5.3 空のフィールドの処理 

  • CSV ファイルに空のフィールドがある場合は、空の文字列または特定の値 (「NA」や「None」など) を使用して空のフィールドを表すことができます。
  • CSV ファイルを読み取るときに、のパラメータ​csv.readerを使用して​skipinitialspace先頭のスペースを処理できます。
5.3.1 空のフィールドの読み取り

次のような名前の CSV ファイルがあるとしますdata.csv

Name,Age,City,Description
John,30,New York,"Software engineer with 5 years of experience. Fluent in English and Español."
Jane,,San Francisco,"Data analyst with a passion for data visualization. Speaks français."
Mike,35,, "Project manager with experience leading international teams. Deutsch sprechen."

上記の CSV ファイルに空のフィールドが存在することに注意してください。

        引き続き と を使用してcsv.readercsv.DictReader空のフィールドを含む CSV ファイルを読み取り、空のフィールドを処理できます。

例 1:

import csv

# 读取CSV文件并输出内容
with open('data.csv', 'r', newline='') as file:
    csv_reader = csv.reader(file)
    for row in csv_reader:
        # 处理空字段
        processed_row = [field.strip() if field.strip() else None for field in row]
        print(processed_row)

出力:

['Name', 'Age', 'City', 'Description']
['John', '30', 'New York', 'Software engineer with 5 years of experience. Fluent in English and Español.']
['Jane', None, 'San Francisco', 'Data analyst with a passion for data visualization. Speaks français.']
['Mike', '35', None, 'Project manager with experience leading international teams. Deutsch sprechen.']

説明:

  1. 1行目は直接出力されるCSVファイルのヘッダー行です。

  2. 2 行目のフィールドAgeは空であり、null 値 (None) として処理されます。

  3. 3 行目のフィールドCityは空であり、null 値 (None) として処理されます。

  4. 4 行目のフィールドはDescription空ではなく、出力は変更されません。

        空のフィールドを扱うときは、リスト内包表記を使用して各行のフィールドを反復処理します。field.strip()これは、フィールドの両側にある空白文字 (改行、スペースなどを含む) を削除するために使用され、その後、条件式を使用して空のフィールドかどうかを判断します。Noneフィールドが空でない場合は元の値が保持され、フィールドが空の場合はnull 値を表すものとして扱われます。最後に、処理後にデータの各行を取得します。

   例 2:  

csv.readerこの CSV ファイルには空のフィールドと先頭のスペースが含まれており、読み取りおよびskipinitialspace=True処理        できます。

import csv

# 读取CSV文件并输出内容
with open('data.csv', 'r', newline='') as file:
    csv_reader = csv.reader(file, skipinitialspace=True)
    for row in csv_reader:
        print(row)

出力

['Name', 'Age', 'City', 'Description']
['John', '30', 'New York', 'Software engineer with 5 years of experience.']
['Jane', '', 'San Francisco', 'Data analyst with a passion for data visualization.']
['Mike', '35', '', 'Project manager with experience leading international teams.']

        この例では、csv.readerで CSV ファイルを読み取り、 でskipinitialspace=True先頭の空白を処理します。結果は、フィールド値の前のスペースが自動的に削除され、先頭にスペースを含むデータをより適切に処理できることを示しています。2 行目と 3 行目では、フィールド「Age」と「City」の値に先頭のスペースが含まれていますが、これらの先頭のスペースは出力では削除されています。

 5.3.2 空のフィールドを処理するためのパラメータの指定

        CSV ファイル内の空のフィールドの処理は、通常、ケースバイケースで決定されます。CSV ファイル内の空のフィールドは、空の文字列 ('') または "NA" や "None" などの特定の値で表すことができます空のフィールドを扱うときは、データの構成と要件に基づいて最も適切な方法を決定する必要があります。

        Pythoncsvモジュールでは、csv.writerおよびcsv.DictWriterパラメータを使用してquoting、空のフィールドの処理方法を指定できます。

空のフィールドを処理するためのオプション:

  1. csv.QUOTE_MINIMAL(デフォルト):フィールドが空の場合、フィールドは空の文字列 ('') として書き込まれます。CSV ファイルを読み取る場合、空の文字列は null 値として解釈されます。

  2. csv.QUOTE_ALL:フィールドが空の場合、フィールドは二重引用符 ("") で囲まれた空の文字列として書き込まれます。CSV ファイルを読み取る場合、空の文字列は null 値として解釈されます。

  3. csv.QUOTE_NONNUMERIC:フィールドが空の場合、フィールドは空の文字列 ('') として書き込まれます。CSV ファイルを読み取る場合、空の文字列は None または空の値として解釈されます。

  4. csv.QUOTE_NONE:フィールドが空の場合、フィールドは空の文字列 ('') として書き込まれます。CSV ファイルを読み取る場合、空の文字列は null 値としてではなく、空の文字列自体として解析されます。

例:

data.csv次のような名前の空のフィールドを含む CSV ファイルがあると仮定します。

Name,Age,City,Description
John,30,New York,
Jane,,San Francisco,"Data analyst with a passion for data visualization."
Mike,35,,Project manager

csv.writerと を使用してcsv.DictWriter空のフィールドを持つこの CSV ファイルを処理し、さまざまなオプションの効果を示します。

import csv

# CSV文件处理选项
quoting_options = [csv.QUOTE_MINIMAL, csv.QUOTE_ALL, csv.QUOTE_NONNUMERIC, csv.QUOTE_NONE]
output_files = ['output_minimal.csv', 'output_all.csv', 'output_nonnumeric.csv', 'output_none.csv']

# 处理CSV文件
for quoting, output_file in zip(quoting_options, output_files):
    # 要写入的数据,包含空字段
    data = [
        ["John", 30, "New York", ""],
        ["Jane", "", "San Francisco", "Data analyst with a passion for data visualization."],
        ["Mike", 35, "", "Project manager"]
    ]

    # 写入CSV文件
    with open(output_file, 'w', newline='') as file:
        csv_writer = csv.writer(file, quoting=quoting)

        # 写入数据
        csv_writer.writerows(data)

print("CSV files with different quoting options have been created.")

        上記の例では、さまざまなquotingオプションを使用して空のフィールドを持つ CSV ファイルを処理し、処理されたデータをさまざまな出力ファイルに書き込みます。

      異なるquotingオプション、つまりcsv.QUOTE_MINIMALcsv.QUOTE_ALLcsv.QUOTE_NONNUMERICおよびを使用して 4 つの出力ファイルを作成しましたcsv.QUOTE_NONE個々の出力ファイルを見て、さまざまなオプションが空のフィールドをどのように処理するかを確認できます。

 結果は次のとおりです

 

おすすめ

転載: blog.csdn.net/qq_35831906/article/details/131983330