python - 不正确的 ndarray 被写入 csv
问题描述
我正在尝试为项目生成音频数据集。为此,我正在使用 Librosa 循环播放我的音频文件(45 秒 mp3 剪辑)并将 3 条数据写入 csv。一个是每个剪辑(一个字符串)的标签,第二个 - 作为浮点时间序列的音频,第三个是采样率。为此,我正在创建 3 的字典并写入 csv。浮点时间序列是一个 ndarray。当我打印长度时,它返回一个值 992250。当它写入文件时,它写入 7 个值(前 3 个和后 3 个,中间有一个 '...' 元素。当我在另一个文件中读取文件时验证了这一点将函数加载到数据框中。我可以帮助解决这个问题吗?谢谢。
我应该补充一点,我首先尝试创建一个数据框并在此版本之前使用 df.to_csv() 。两者都不起作用,它们都有相同的问题。我也在网上查了其他的选项,貌似Numpy数组可以直接写入csv?但我还需要每一行都有标签(下面的'ragam')和'sr'。
with open('audio_data.csv', 'w') as f:
writer = csv.DictWriter(f, fieldnames=headers)
writer.writeheader()
for i, file in enumerate(flst):
if file.endswith(".mp3"):
audio, sr = librosa.core.load(os.getcwd() + folderpath + "/" + file)
print(type(audio))
print(str(len(audio)))
ragam = file.split(sep='-')[0]
elem = {
'ragam': ragam,
'audio': audio,
'sr': sr
}
writer.writerow(elem)
print("Completed: " + str(i + 1) + " of " + str(total) + " ...")
我决定将增量附加到 csv,因为它是一个大型数据集,我想尝试保留任何进展,以防中途出现故障。这是一个输出示例。
Loading audio data ...
/usr/local/lib/python3.7/dist-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.
warnings.warn("PySoundFile failed. Trying audioread instead.")
<class 'numpy.ndarray'>
992250
Completed: 1 of 5 ...
解决方案
该方法writerow
将字典elem
中的每个复杂对象转换为其字符串表示形式,这就是您获得此意外输出的原因。
一个简单的解决方法是将 the 转换np.array
为 a list
,即使用
elem = {
'ragam': ragam,
'audio': audio.tolist(),
'sr': sr
}
通过这种更正,输出看起来不错,但列表保存为字符串,因此恢复读取输出 csv 的初始数组并不容易。
另一种方法是将所有内容保存为 JSON,因为 JSON 本身支持列表和字典。
推荐阅读
- sqlite - 我需要帮助为我的课程创建一个明确的内部连接
- python - 如何构建一个 Python 比较器,以 PostgreSQL 的方式对字符串进行排序?
- java - Spring MVC 轮播
- android - Ionic Cordova 7.1.4 Android 构建失败
- c++ - 如何处理来自另一个线程的 win32 事件?
- python - Python从字符串中删除嵌套的unicode'u'符号
- amazon-web-services - 无法使用 Postman 使用预签名 URL 将文件上传到 S3。错误:签名不匹配
- javascript - 将元素绝对定位在部分底部会添加不需要的第二个滚动条
- c# - 使用多个用户控件从 Mysql 数据库加载大数据的最佳方法
- html - 每行中具有相同高度单元格的表格布局