Python は csv ファイルの読み取りと書き込みを行う
はじめに
カンマカンマ区切り値 (CSV、区切り文字がカンマ以外の場合があるため、文字区切り値と呼ばれることもあります) ファイルには、表形式のデータ (数値とテキスト) がプレーン テキストで保存されます。プレーン テキストとは、ファイルが一連の文字であり、2 進数のように解釈する必要があるデータが含まれていないことを意味します。 CSV ファイルは、何らかの改行文字で区切られた任意の数のレコードで構成されます。各レコードはフィールドで構成され、フィールド間の区切り文字は他の文字または文字列 (最も一般的にはカンマまたはタブ) です。通常、すべてのレコードはまったく同じフィールド順序を持ちます。
特長
読み出されるデータは通常文字型で、数値の場合は数値の場合
行単位でデータを読み込む
列は半角カンマまたはタブで区切られており、通常は半角カンマです
一般的には各行の先頭にスペースはありません。最初の行は属性列です。データ列は区切り文字で区切られています。スペースはなく、行間に空白行はありません。
行間に空行がないことが非常に重要です。データ セット内の行の末尾に空行がある場合、またはスペースがある場合、通常、データの読み取り時にエラーが発生します。 [リストインデックスが範囲外です]エラーが発生します。 PS: 私はこのエラーに何度も騙されました。
Python I/Oを使用したCSVファイルの書き込みと読み取り
Python I/Oを使用したCSVファイルの書き込み
次のこれは、作成者のソースから「birthweight.dat」低出生体重児データ ファイルをダウンロードし、処理して csv ファイルに保存するコードです。
import csv import os import numpy as np import random import requests # name of data file # 数据集名称 birth_weight_file = 'birth_weight.csv' # download data and create data file if file does not exist in current directory # 如果当前文件夹下没有birth_weight.csv数据集则下载dat文件并生成csv文件 if not os.path.exists(birth_weight_file): birthdata_url = 'https://github.com/nfmcclure/tensorflow_cookbook/raw/master/01_Introduction/07_Working_with_Data_Sources/birthweight_data/birthweight.dat' birth_file = requests.get(birthdata_url) birth_data = birth_file.text.split('\r\n') # split分割函数,以一行作为分割函数,windows中换行符号为'\r\n',每一行后面都有一个'\r\n'符号。 birth_header = birth_data[0].split('\t') # 每一列的标题,标在第一行,即是birth_data的第一个数据。并使用制表符作为划分。 birth_data = [[float(x) for x in y.split('\t') if len(x) >= 1] for y in birth_data[1:] if len(y) >= 1] print(np.array(birth_data).shape) # (189, 9) # 此为list数据形式不是numpy数组不能使用np,shape函数,但是我们可以使用np.array函数将list对象转化为numpy数组后使用shape属性进行查看。 with open(birth_weight_file, "w", newline='') as f: # with open(birth_weight_file, "w") as f: writer = csv.writer(f) writer.writerows([birth_header]) writer.writerows(birth_data) f.close()
よくある間違いリストのインデックスが範囲外です
話しなければならない重要なことは、open(birth_weight_file, " w" , newline='') as f: このステートメント。 CSV ファイルの書き込みを示します。パラメータ newline='' が追加されていない場合は、改行文字としてスペースが使用されることを意味します。代わりに、with open(birth_weight_file, "w") as f: ステートメントを使用します。生成されたテーブルには空白の行が表示されます。
Python I/O を使用して CSV データを読み書きするだけでなく、他のメソッドを使用して CSV データを読み書きしたり、インターネットから取得した csv データセット 各行の後にスペースがないか、余分な空白行がないか確認してください。データ分析時の判断に影響を与える不要なエラーを回避します。
Python I/O を使用して csv ファイルを読み取る
Python I/O メソッドを使用して読み取る場合は、新しいリストを作成し、次の順序に従います。最初に行と列 (C 言語の 2 次元配列に似ています) を空の List オブジェクトに格納します。numpy 配列に変換する必要がある場合は、np.array(List name) を使用して相互に変換することもできます。オブジェクト。
birth_data = [] with open(birth_weight_file) as csvfile: csv_reader = csv.reader(csvfile) # 使用csv.reader读取csvfile中的文件 birth_header = next(csv_reader) # 读取第一行每一列的标题 for row in csv_reader: # 将csv 文件中的数据保存到birth_data中 birth_data.append(row) birth_data = [[float(x) for x in row] for row in birth_data] # 将数据从string形式转换为float形式 birth_data = np.array(birth_data) # 将list数组转化成array数组便于查看数据结构 birth_header = np.array(birth_header) print(birth_data.shape) # 利用.shape查看结构。 print(birth_header.shape) # # (189, 9) # (9,)
Pandas を使用して CSV ファイルを読み取る
import pandas as pd csv_data = pd.read_csv('birth_weight.csv') # 读取训练数据 print(csv_data.shape) # (189, 9) N = 5 csv_batch_data = csv_data.tail(N) # 取后5条数据 print(csv_batch_data.shape) # (5, 9) train_batch_data = csv_batch_data[list(range(3, 6))] # 取这20条数据的3到5列值(索引从0开始) print(train_batch_data) # RACE SMOKE PTL # 184 0.0 0.0 0.0 # 185 0.0 0.0 1.0 # 186 0.0 1.0 0.0 # 187 0.0 0.0 0.0 # 188 0.0 0.0 1.0
Tensorflow を使用して CSV ファイルを読み取る
通常は Tensorflow を使用しますさまざまな種類のデータを処理するため、Tensorflow を使用してデータを読み取る方法についてはあまり説明しませんが、以下にコードを貼り付けます。
'''使用Tensorflow读取csv数据''' filename = 'birth_weight.csv' file_queue = tf.train.string_input_producer([filename]) # 设置文件名队列,这样做能够批量读取文件夹中的文件 reader = tf.TextLineReader(skip_header_lines=1) # 使用tensorflow文本行阅读器,并且设置忽略第一行 key, value = reader.read(file_queue) defaults = [[0.], [0.], [0.], [0.], [0.], [0.], [0.], [0.], [0.]] # 设置列属性的数据格式 LOW, AGE, LWT, RACE, SMOKE, PTL, HT, UI, BWT = tf.decode_csv(value, defaults) # 将读取的数据编码为我们设置的默认格式 vertor_example = tf.stack([AGE, LWT, RACE, SMOKE, PTL, HT, UI]) # 读取得到的中间7列属性为训练特征 vertor_label = tf.stack([BWT]) # 读取得到的BWT值表示训练标签 # 用于给取出的数据添加上batch_size维度,以批处理的方式读出数据。可以设置批处理数据大小,是否重复读取数据,容量大小,队列末尾大小,读取线程等属性。 example_batch, label_batch = tf.train.shuffle_batch([vertor_example, vertor_label], batch_size=10, capacity=100, min_after_dequeue=10) # 初始化Session with tf.Session() as sess: coord = tf.train.Coordinator() # 线程管理器 threads = tf.train.start_queue_runners(coord=coord) print(sess.run(tf.shape(example_batch))) # [10 7] print(sess.run(tf.shape(label_batch))) # [10 1] print(sess.run(example_batch)[3]) # [ 19. 91. 0. 1. 1. 0. 1.] coord.request_stop() coord.join(threads) ''' 对于使用所有Tensorflow的I/O操作来说开启和关闭线程管理器都是必要的操作 with tf.Session() as sess: coord = tf.train.Coordinator() # 线程管理器 threads = tf.train.start_queue_runners(coord=coord) # Your code here~ coord.request_stop() coord.join(threads) '''
Pythonでファイルを読み込む方法は他にもありますが、ここでは3つ紹介し、随時補足していきます。
以上がPythonでCSVファイルを読み取る方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。