按列将嵌套列表写入csv

时间:2019-08-29 20:32:37

标签: python list csv writefile

我有一个列表列表,看起来像这样:

signals_list = [ [1,4,7..... 5,7],[4,-7,1....-5,-8,4],.....]

我想将这些内部列表按列写入一个csv文件中。 我有176个内部列表,需要创建176列。每个内部列表几乎有39400个瞬间。

Csv应该如下所示:

enter image description here

  

我尝试过的事情:

     

writing nested list into csv python

     

write python list of list into csv python

我做了什么

# 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()
  

输出

     

Output for my above code

我们将不胜感激任何帮助

4 个答案:

答案 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)