技術共有

Python - CSV ファイルの読み取りと書き込み

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

目次

CSVライブラリのメソッドパラメータ

読み取りデータ

csv.reader メソッド

ファイル指定の行または列データの読み取り操作

txt ファイルの読み取り行、読み取りメソッド

csv.DictReader メソッド

データ入力

txt ファイルの書き込み、書き込み行

csv.writer メソッド

csv.DictWriter メソッド

読み取り/書き込み共用体 (データの変更と挿入)


CSV ファイルの読み書きを行う場合、通常、ファイル パス、開くモード、文字エンコーディングなどの問題に対処する必要があります。 通常、newline='' パラメータは、CSV ファイルの読み取りおよび書き込み時に、ファイルの読み取りおよび書き込みが Windows システムの改行文字の影響を受けないようにするために使用されます。 txt ファイルと csv ファイルは相互変換をサポートしているため、txt ファイルの読み取りと書き込みは csv ファイルにも完全に適用できます。

CSVライブラリのメソッドパラメータ

パラメータデフォルト値説明する
デリミタ,CSV ファイル内の値 (またはフィールド) を区切るために使用される文字を指します。
初期スペースをスキップ間違い区切り文字に続くスペースがどのように解釈されるかを制御します。 True の場合、最初の空白は削除されます。
行末文字rnこれは、行を終了するために使用される文字のシーケンスを指します。
引用文字"これは、フィールドに特殊文字 (区切り文字など) が含まれる場合に値を参照するために使用される単一の文字列を指します。たとえば、「0,0」には「」が含まれます。,"の場合、"" 内のデータをまとめて扱うには quotechar=""" を使用できます。 '0,0' を使用する場合は、quotechar="'" を使用できます。
引用csv.QUOTE_NONE引用が作成者によって生成されるか、読者によって認識されるかを制御します (他のオプションについては上記を参照)。
エスケープ文字なしquote が引用符に設定されている場合、区切り文字をエスケープするために使用される 1 文字の文字列になります。
二重引用符真実フィールド内の引用符の処理を制御します。いつ真実読み取り時には、2 つの連続する引用符は 1 つの引用符として解釈されますが、書き込み時には、データに埋め込まれた各引用符文字は 2 つの引用符として書き込まれます。デフォルトでは、二重引用符は True に設定されます。 その結果、2 つの連続する二重引用符は、読み取られたときに 1 つとして解釈されます。 doublequote が False に設定されている場合、連続した二重引用符が出力に表示されます。

読み取りデータ

csv.reader メソッド

  1. import csv
  2. with open(file_name, 'r', encoding='utf-8-sig') as f:
  3. reader = csv.reader(f) # 创建csv阅读器对象,读取所有有效数据,返回结果为一个迭代器类对象
  4. for data in reader: # 遍历每一行的数据
  5. print(data)

エンコードでは、エンコード形式を utf-8-sig として指定できます。これにより、BOM 文字が自動的に処理され、ufeff の発生が排除されます。

ファイル指定の行または列データの読み取り操作
  1. with open(file_name, 'r', encoding='utf-8-sig') as f:
  2. reader = csv.reader(f)
  3. list_csv = list(reader)
  4. for i in range(len(list_csv)-5,len(list_csv)): # 如读取后5行数据
  5. print(list_csv[i])
  6. print(list_csv[i][:3]) # 读取指定列数据

txt ファイルの読み取り行、読み取りメソッド

txt ファイルの読み取りメソッド readlines() および read() を使用すると、読み取りデータに処理が必要な改行が含まれます。CSVライブラリをインポートする必要はありません

  1. with open(file_name, 'r', encoding='utf-8-sig') as f:
  2. reader_lines = f.readlines() # 读取所有行放在一个列表中
  3. for da in reader_lines: # 也可以使用range方法读取指定行的数据,读取结果中有换行符需要处理
  4. print(da.replace('n',''))
  5. reader = f.read()
  6. print(reader)

csv.DictReader メソッド

辞書の形式でデータを読み取り、印刷されるデータは辞書のキーと値のペアの形式になります。

  1. with open(file_name,'r', encoding='utf-8-sig',newline='') as f:
  2. reader =csv.DictReader(f)
  3. for r in reader:
  4. print(r)

データ入力

txt ファイルの書き込み、書き込み行

CSVライブラリをインポートする必要はありません

txt ファイルの write および writelines を使用してデータを書き込むと、文字中の英語のカンマは水平タブ文字 tab として認識され、改行文字は行折り返し用の垂直タブ文字として認識されます。空白行を挿入する場合は、data パラメーターに改行文字を使用します。空のセルを書き込む場合は、data パラメーターにカンマを使用します。

  1. with open(file_name, 'w', newline='') as f:
  2. f.write('测试写入数据操作n')
  3. f.write('n')
  4. f.writelines(["角色管理,测试测试", "账号管理n", "部门管理n"])

  

csv.writer メソッド

データを書き込むときは、文字列、リスト、タプル、セット、辞書などの走査可能なオブジェクトとなる変数を受け入れます。[文字列は各文字をセルに個別に入力し、辞書は走査してキーを書き込みます]。 writerow は単一行のデータを書き込むために使用され、writerows は複数行のデータを書き込むために使用されます。

  1. with open(file_name, 'w', newline='') as f:
  2. ws = csv.writer(f) # 创建一个写入文件对象
  3. ws.writerow([]) # 列表内容为空,插入的是一个空行
  4. ws.writerow(["设备实时监控", "设备数据列表", "设备报警分析"]) # 列表数据
  5. ws.writerow(("角色管理", "账号管理", "部门管理")) # 元组数据
  6. write_data = ['贾史王薛',
  7. ['贾不假,白玉为堂金作马', '阿房宫,三百里,住不下金陵一个史', '东海缺少白玉床,龙王请来金陵王',
  8. '丰年好大雪,珍珠如土金如铁'], ('cao', 'xue', 'qin', 'shu'), {'曹', '雪', '芹', '书'},
  9. {'贾': '宝玉', '史': '湘云', '王': '熙凤', '薛': '宝钗'},
  10. {'贾': '宝玉', '史': '湘云', '王': '熙凤', '薛': '宝钗'}.values()]
  11. ws.writerows(write_data) # writerows写入多行数据

csv.DictWriter メソッド

データを書き込むとき、DictWriter は辞書キーに基づいてキーがフィールド名にあるかどうかを判断する必要があります。存在しない場合は、既知の辞書データと未知の辞書データをすべて追加する必要がある場合は、最初にすべてを読み取ることができます。書き込む必要があるデータのキーを取得し、元のファイル ヘッダーと比較して (元のファイル ヘッダーを読み取り)、ヘッダー リストに追加してからデータを書き込みます。

  1. fieldnames = ['姓氏', '人物', '说明'] # 表头
  2. dictate = [{'姓氏': '贾', '人物': "宝玉"}, {'姓氏': '史', '人物': "湘云"}, {'姓氏': '王', '人物': "熙凤"},
  3. {'姓氏': '薛', '人物': "宝钗"}]
  4. with open(file_name, 'w', newline='') as f:
  5. write = csv.DictWriter(f, fieldnames=fieldnames, delimiter=',')
  6. write.writeheader() # 写入表头
  7. write.writerow({'姓氏': '贾', '人物': "宝玉"}) # 单行模式写入
  8. write.writerows(dictate) # 多行模式写入

読み取り/書き込み共用体 (データの変更と挿入)

原則: 最初に元のファイル データを読み取り、それをリスト ストレージに転送し、次にリスト メソッドを使用して取得したリストに基づいて追加、削除などの操作を実行し、最後に変更されたリスト データを複数行書き込みを使用してファイルに書き込みます。

  1. # 第一步:读取数据
  2. with open(file_name, 'r+', newline='') as f:
  3. file_csv_data = list(csv.reader(f))
  4. # 第二步:操作数据
  5. # 插入数据
  6. file_csv_data.insert(2, '贾史王薛') # 在某行插入一行数据,如在第3行插入数据
  7. file_csv_data[2].insert(0, '红楼四大家族') # 在指定单元格插入数据,如在3行1列的单元格插入数据
  8. # 修改数据
  9. file_csv_data[2] = ['贾不假,白玉为堂金作马', '阿房宫,三百里,住不下金陵一个史', '东海缺少白玉床,龙王请来金陵王',
  10. '丰年好大雪,珍珠如土金如铁', ''] # 修改指定行一行数据
  11. file_csv_data[2][4] = '葫芦僧判葫芦案' # 修改某一单元格数据,如修改3行5列数据
  12. # 修改符合条件的数据数据
  13. # 修改符合要求的单元格数据:通过for循环遍历判断,例如修改单元格中包含1的数据,将1替换成一
  14. # for r_id, row in enumerate(file_csv_data): # 通过行号列号修改
  15. # for c_id, col in enumerate(row):
  16. # if '1' in col:
  17. # file_csv_data[r_id][c_id] = col.replace('1', '一')
  18. for row in file_csv_data: # 通过行数据及列号修改,比上面更方便
  19. for c_id, col in enumerate(row):
  20. if '1' in col:
  21. row[c_id] = col.replace('1', '一')
  22. # 第三步:写入报存数据
  23. with open(file_name, 'w', newline='') as f:
  24. write_file = csv.writer(f)
  25. write_file.writerows(file_csv_data)