1. 文件读取的一般流程

  1. 文件队列构造
  2. 文件阅读器
  3. 文件内容解码器
  4. 批处理

前3个步骤都是读取一个样本,第四步读取多个样本。

2. 每个步骤需要的API

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
读取数据中也用到线程的操作:
在这里插入图片描述

3. 文件读取案例

各种文本文件,这里使用的是txt文件,其他csv之类的都可以。

import tensorflow as tf
import os

main_path = "F:/文本文件数据/"
# 导入数据的准备
file_name = os.listdir(main_path)
print(file_name) # 以列表的形式列出文件的名字

# 完整路径
file_list = [os.path.join(main_path,file) for file in file_name] # join是连接字符串的方法,和“+”相同


# # 也可以这样写,意思一样只是“+”代替了join
# file_list1 = [main_path+x for x in os.listdir(main_path)] 


# 1.构建文件的队列
file_queue = tf.train.string_input_producer(file_list)

# 2.构造阅读器读取队列数据
reader = tf.TextLineReader()
key , value = reader.read(file_queue)

# 3.对每一行内容进行解码
# record_defaults:指定每一个样本的每一列的类型,指定默认值
records = [["None"],["None"]] # 指定数据的两列都是字符串类型且默认值是None
example, label = tf.decode_csv(value,record_defaults=records) #样本有两列,所以有两个值接受
print(example,label)

# 开启会话
with tf.Session() as sess:
    # 定义一个线程协调器
    coord = tf.train.Coordinator()
    
    #开启读文件的线程(这里比之前开启线程方便很多,有专门的的API)
    threads = tf.train.start_queue_runners(sess, coord=coord)
    
    print(sess.run([example,label]))
    
    # 回收线程
    
    coord.request_stop()
    
    coord.join(threads)
    

结果:在这里插入图片描述

需要注意 tf.decode_csv(value,record_defaults=records) 的record_defaults参数[[“None”],[“None”]]表示样本中的两列都是字符串,若有缺失值用None代替,若样本中的是数字可以这样 [[1],[2]],表示是int类型,第一列若有缺失值用1代替,第二列若有缺失值用2代替,其他类型类似。

因为,阅读器tf.TextLineReader()是默认按每一行读取,所以一次就读取一行,若想批量读取需要tf.train.batch()函数

代码:

import tensorflow as tf
import os

main_path = "F:/文本文件数据/"
# 导入数据的准备
file_name = os.listdir(main_path)
print(file_name) # 以列表的形式列出文件的名字

# 完整路径
file_list = [os.path.join(main_path,file) for file in file_name] # join是连接字符串的方法,和“+”相同


# # 也可以这样写,意思一样只是“+”代替了join
# file_list1 = [main_path+x for x in os.listdir(main_path)] 


# 1.构建文件的队列
file_queue = tf.train.string_input_producer(file_list)

# 2.构造阅读器读取队列数据
reader = tf.TextLineReader()
key , value = reader.read(file_queue)

# 3.对每一行内容进行解码
# record_defaults:指定每一个样本的每一列的类型,指定默认值
records = [["None"],["None"]] # 指定数据的两列都是字符串类型且默认值是None
example, label = tf.decode_csv(value,record_defaults=records) #样本有两列,所以有两个值接受
print(example,label)


# 4.想要读取多个数据
example_batch, label_batch = tf.train.batch([example, label], batch_size=9,num_threads=1, capacity=9)

print(example_batch,label_batch)

# 开启会话
with tf.Session() as sess:
    # 定义一个线程协调器
    coord = tf.train.Coordinator()
    
    #开启读文件的线程(这里比之前开启线程方便很多,有专门的的API)
    threads = tf.train.start_queue_runners(sess, coord=coord)
    
    print(sess.run([example_batch,label_batch]))
    
    # 回收线程
    
    coord.request_stop()
    
    coord.join(threads)
    
 

结果

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐