Python Tensorflow数据集打开多个文件并将它们分开

Python Tensorflow数据集打开多个文件并将它们分开,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,我试图有一个三维数据集,每个数据点是在一个单独的csv文件组成的线和我的特点是在列 我尝试了几种向数据集中添加文件列表的方法 files=os.listdir(“路径”) dataset=tf.data.dataset.from_tensor_切片(文件) 或 dataset=tf.data.dataset.list_文件(“path/*.csv”) 这两种方法似乎都很有效,但要打开文件,我不能依赖于Dataset.TextLineDataset,因为它会将我所有的数据合并成一个大的2d数据

我试图有一个三维数据集,每个数据点是在一个单独的csv文件组成的线和我的特点是在列 我尝试了几种向数据集中添加文件列表的方法

files=os.listdir(“路径”)
dataset=tf.data.dataset.from_tensor_切片(文件)

dataset=tf.data.dataset.list_文件(“path/*.csv”)
这两种方法似乎都很有效,但要打开文件,我不能依赖于
Dataset.TextLineDataset
,因为它会将我所有的数据合并成一个大的2d数据集

我试过使用

dataset=dataset.map(解析文件)

def parse_文件(文件名):
data=np.genfromtxt(str(文件名),分隔符=',')
返回数据
以数组的形式获取,但我得到了错误

OSError: Tensor("args_0:0", shape=(), dtype=string) not found.
我做错了什么

编辑:数据如下所示,有几个文件都是这种形式(没有标题):

最后,我想要一个三维表示,其中第一个维度是文件,第二个维度是线,第三个维度是列 像


遇到的错误是因为您试图在
map
调用中使用python/numpy函数。出于性能原因,tf.data以图形模式运行其op,这意味着传递给map的每个函数都应该是
tensorflow
的本机函数,或者封装在
tf.python_func
/
tf.numpy_func
中。当涉及到I/O操作(如读取文件)时,这是非常棘手的,因为几乎必须使用本机
tensorflow
函数

下面是一种读取csv并将其放入数据集中的方法。数据集的每个元素都位于一个csv文件中

import tensorflow as tf

def read_csv(filepath):
    content = tf.io.read_file(filepath)
    # taking care of trailing whitespace
    content_no_trailing = tf.strings.strip(content)
    lines = tf.strings.split(content_no_trailing, sep="\n")
    values = tf.map_fn(lambda x: tf.strings.split(x, sep=","), lines)
    # we have to nest two calls to map_fn, one for each line, then for each columns
    float_values = tf.map_fn(
        lambda x: tf.map_fn(tf.strings.to_number, x, fn_output_signature=tf.float32),
        values,
        fn_output_signature=tf.float32,
    )
    return float_values

files = ["test1.csv", "test2.csv"] # or any way to get a list of file names
list_ds = tf.data.Dataset.from_tensor_slices(files)
ds = list_ds.map(read_csv)
写入具有相同内容的文件“test1.csv”和“test2.csv”,然后在我们看到的数据集上循环:

>>> for elem in ds:print(elem)
tf.Tensor(
[[1.4985620e+12 5.1891048e+01 1.2412850e+01 0.0000000e+00]
 [1.4985623e+12 5.1891052e+01 1.2412848e+01 0.0000000e+00]
 [1.4985626e+12 5.1891045e+01 1.2412857e+01 0.0000000e+00]], shape=(3, 4), dtype=float32)
tf.Tensor(
[[1.4985620e+12 5.1891048e+01 1.2412850e+01 0.0000000e+00]
 [1.4985623e+12 5.1891052e+01 1.2412848e+01 0.0000000e+00]
 [1.4985626e+12 5.1891045e+01 1.2412857e+01 0.0000000e+00]], shape=(3, 4), dtype=float32)

你能添加一个数据样本吗?i、 您的CSV(或模拟数据)的第一行,以及您试图实现的结果?我刚刚用数据示例进行了编辑(顺便说一下,分隔符是错误的,但这似乎不是问题),数据非常简单这似乎是我真正需要的,剩下的唯一问题是,我所有的csv文件的末尾都有一个空行,这似乎打破了解析文件的过程。你知道如何避免这种情况吗?还是我只需要将所有文件都更改为没有该结尾行?(我宁愿避免这种解决方案,因为这是我使用csv.writer.writerows时自动写入文件的方式)您可以使用
tf.strings.strip
,我编辑了我的答案,添加了该功能。,
import tensorflow as tf

def read_csv(filepath):
    content = tf.io.read_file(filepath)
    # taking care of trailing whitespace
    content_no_trailing = tf.strings.strip(content)
    lines = tf.strings.split(content_no_trailing, sep="\n")
    values = tf.map_fn(lambda x: tf.strings.split(x, sep=","), lines)
    # we have to nest two calls to map_fn, one for each line, then for each columns
    float_values = tf.map_fn(
        lambda x: tf.map_fn(tf.strings.to_number, x, fn_output_signature=tf.float32),
        values,
        fn_output_signature=tf.float32,
    )
    return float_values

files = ["test1.csv", "test2.csv"] # or any way to get a list of file names
list_ds = tf.data.Dataset.from_tensor_slices(files)
ds = list_ds.map(read_csv)
>>> for elem in ds:print(elem)
tf.Tensor(
[[1.4985620e+12 5.1891048e+01 1.2412850e+01 0.0000000e+00]
 [1.4985623e+12 5.1891052e+01 1.2412848e+01 0.0000000e+00]
 [1.4985626e+12 5.1891045e+01 1.2412857e+01 0.0000000e+00]], shape=(3, 4), dtype=float32)
tf.Tensor(
[[1.4985620e+12 5.1891048e+01 1.2412850e+01 0.0000000e+00]
 [1.4985623e+12 5.1891052e+01 1.2412848e+01 0.0000000e+00]
 [1.4985626e+12 5.1891045e+01 1.2412857e+01 0.0000000e+00]], shape=(3, 4), dtype=float32)