我有一个列表列表,看起来像这样:
signals_list = [ [1,4,7..... 5,7],[4,-7,1....-5,-8,4],.....]
我想将这些内部列表按列写入一个csv文件中。 我有176个内部列表,需要创建176列。每个内部列表几乎有39400个瞬间。
Csv应该如下所示:
我尝试过的事情:
我做了什么
# GETTING ALL THE WAV FILES FROM DIRECTORY AND CONVERTING INTO NUMPY ARRAY
path = "C:/Users/Marwat/.spyder-py3/FYP/input/set_a/"
files = os.listdir(path)
print(len(files))
signals_list = []
for filename in glob.glob(os.path.join(path, '*.wav')):
sample_rate, data = wavfile.read(filename)
signals = [np.array(data,dtype=int)]
signals_list.append(signals)
# WRITING SIGNALS TO CSV FILE
d = [signals_list]
col_name = 1
transposed_signals = zip_longest(*d, fillvalue = '')
with open('C:/Users/Marwat/.spyder-py3/FYP/input/numbers.csv', 'w', encoding="ISO-8859-1", newline='') as myfile:
wr = csv.writer(myfile)
wr.writerow('sound_'+ str(col_name))
wr.writerows(transposed_signals)
col_name +=1
myfile.close()
输出
我们将不胜感激任何帮助
答案 0 :(得分:1)
您几乎可以理解。您遇到问题的两个地方是:
1)将signals_list
放在外部列表中。将signals_list
直接传递到zip_longest
,您应该在那里设置
transposed_signals = list(zip_longest(*signals_list, fill_value = ''))
2)写入标题行。首先,您需要写该行中的所有列(您只写一个)。此外,writerow()
期望可迭代,这就是为什么在传递字符串时,每列只能获得一个字符的原因。请改用此方法,并忽略col_name
:
wr.writerow(('sound_' + str(i + 1) for i in range(len(transposed_signals))))
将它们放在一起(仅第二部分),您应该具有:
transposed_signals = list(zip_longest(*signals_list, fillvalue=''))
with open('C:/Users/Marwat/.spyder-py3/FYP/input/numbers.csv', 'w', encoding="ISO-8859-1", newline='') as myfile:
wr = csv.writer(myfile)
wr.writerow(('sound_' + str(i + 1) for i in range(len(transposed_signals))))
wr.writerows(transposed_signals)
# Calling myfile.close() isn't necessary since `with` does that automatically upon exiting that scope.
答案 1 :(得分:0)
您可以将列表转换为numpy数组并进行转置
array = np.array(signals_list)
array = array.T
然后使用熊猫创建一个DataFrame并将其存储为csv
df = pd.DataFrame(array)
df.to_csv('my_signals.csv')
答案 2 :(得分:0)
PS C:\> "13.9GB = $(1024 * $Script:Size1.Replace('GB', ''))MB"
13.9GB = 14233.6MB
zip()
会转置列表*,因此行变成列,而列变成行。根据第二个链接,您可以执行以下操作:
zip()
如果这对您不起作用,请告诉我它如何不起作用,以便我进行修复。
*它实际上不是 转置列表,而是“聚合来自每个可迭代对象的元素”,在这种情况下,本质上是相同的。
答案 3 :(得分:0)
您可以创建一个dataframe
,对其进行转置,然后将标题设置在适当的位置,并将其导出到一个csv文件中
import pandas as pd
signals_list = [[1,4,7],[4,-7,1],[1,9,8]]
df = pd.DataFrame(data =signals_list ,columns=["a","b","c"]).T
df.columns = df.index.tolist()
df.to_csv("file.csv", index=False)