我有一个问题与这个问题密切相关:
How to convert .wav files into a Pandas DataFrame in order to feed it to a neural network?
我用以下代码创建了一个pandas DataFrame:
df = pd.DataFrame(data={"wavsamples": pd.Series(wavsamples), "wavsamplerate": pd.Series(wavsamplerate), "wavname": pd.Series(wavname)}, copy=False, columns = ['wavsamples','wavsamplerate','wavname'])
df.index.name = 'filenumber'
字符串
如果我打印pandas DataFrame中的第二列,
与
print(df.wavsamples.to_string(index=False))
型
它向我展示了Pandas系列“wavsamples”,看起来像这样:
[0.02709961, 0.06796265, -0.011810303, -0.23361...
[0.0068969727, 0.04547119, 0.043029785, -0.1025...
[-0.005432129, 0.021057129, 0.078063965, 0.0270...
[0.00079345703, 0.064941406, 0.09710693, -0.088...
[-0.0067749023, 0.008087158, 0.06536865, 0.0219...
[-0.008758545, 0.015106201, 0.08139038, 0.02600...
[-0.0034179688, 0.039733887, 0.07711792, 0.1164...
[-0.0008087158, -0.000579834, -0.00062561035, -...
[0.021026611, 0.029907227, 0.040527344, 0.05448...
[0.017288208, 0.026321411, 0.0340271, 0.0403137...
[0.019561768, 0.026611328, 0.03668213, 0.047576...
[0.022827148, 0.03414917, 0.056289673, 0.078018...
型
这12行中的每一行都表示.wav文件的原始浮点样本值。现在,如果我将这些数组写入CSV文件的列中,并使用:
df.to_csv("./test.csv", sep=',', columns = ['wavsamples','wavsamplerate','wavname'])
型
我得到以下CSV文件:
filenumber,wavsamples,wavsamplerate,wavname
0,"[ 0.02709961 0.06796265 -0.0118103 ... -0.36627197 -0.36645508
-0.3657837 ]",44100,Audio1.wav
1,"[ 0.00689697 0.04547119 0.04302979 ... -0.03359985 -0.03244019
-0.03167725]",44100,Audio2.wav
2,"[-0.00543213 0.02105713 0.07806396 ... 0.45645142 0.45541382
0.45510864]",44100,Audio3.wav
3,[0.00079346 0.06494141 0.09710693 ... 0.22116089 0.22421265 0.22741699],44100,Audio4.wav
4,"[-0.0067749 0.00808716 0.06536865 ... 0.24209595 0.23977661
0.23754883]",44100,Audio5.wav
5,"[-0.00875854 0.0151062 0.08139038 ... -0.0256958 -0.0184021
-0.01156616]",44100,Audio6.wav
6,"[-0.00341797 0.03973389 0.07711792 ... 0.41384888 0.41375732
0.41348267]",44100,Audio7.wav
7,"[-0.00080872 -0.00057983 -0.00062561 ... 0.0100708 0.0100708
0.01000977]",44100,Audio8.wav
8,[0.02102661 0.02990723 0.04052734 ... 0.00976562 0.00965881 0.00990295],44100,Audio9.wav
9,[0.01728821 0.02632141 0.0340271 ... 0.01344299 0.01341248 0.01325989],44100,Audio10.wav
10,[0.01956177 0.02661133 0.03668213 ... 0.0141449 0.01400757 0.01402283],44100,Audio11.wav
11,[0.02282715 0.03414917 0.05628967 ... 0.01019287 0.01037598 0.01025391],44100,Audio12.wav
型
所以列'wavsamples'丢失了所有的逗号。如果我现在从csv文件中读取并打印列:
with open("./test.csv", "r") as csv_file:
reader = csv.reader(csv_file)
rows = list(reader)
audiofile = rows[12][1]
print(audiofile)
型
我只得到:
第一个月
不仅所有的逗号都被删除了,而且由于wavsamples列被视为字符串,三个点被误认为是文字点字符,因此当将它们写入CSV时,中间的所有样本值都会丢失。
我知道CSV可能是存储.wav数据的最差格式,就像在这里多次指出的堆栈溢出一样.但我只是好奇-有没有办法在CSV列内的浮点值之间存储音频数组?
当我从csv中读取一些内容时,我想得到这样的结果:
[0.022827148, 0.03414917, 0.056289673, 0.078018...
型
而不是这样:
[0.02282715 0.03414917 0.05628967 ... 0.01019287 0.01037598 0.01025391]
我如何编写csv列,以便以后能够正确地阅读它?
2条答案
按热度按时间wr98u20j1#
CSV格式不支持列中的列表类型,你需要标量值。这里发生的是
pandas
将隐式地将包含列表类型的列转换为字符串。它与你选择的类型无关。如果你必须使用CSV格式,一种可能的处理方法是使用
ast.literal_eval
将其解析回列表类型,当你读回数据时,将其应用于该列。字符串
如果你使用
polars
而不是pandas
,这种隐式转换将是不允许的,它会抛出一个异常。尽管事实上it has aList
type as a first-class citizen。对于这种数据,你真的应该考虑一种格式,比如parquet
,它不仅解析速度快 * 很多倍 *,而且会原生地处理列的嵌套结构。最后,在你的问题中,你指定使用
csv
模块来读回数据。你可以这样做,但我不认为这是特别优雅的,考虑到我提到的对CSV的限制。这适用于我给出的例子,它假设所有其他非列表列都是int
,否则你需要逐个处理它们。型
为了使事情更复杂,你的列中实际上没有列表,但实际上有
np.ndarray
对象。当它们被转换为字符串时,你失去了来自__repr__
的逗号以及其他复杂性。型
保存自己一个额外的头痛使用:
型
df.to_csv()
...你现在可能会看到为什么CSV不是一个伟大的格式在这里...
9vw9lbht2#
使用这个:
字符串
更多信息请查看:
型